2015-08-24 7 views
10

मैं Express.js और Multer का उपयोग कर एक HTML फ़ॉर्म से फ़ाइल अपलोड करने का प्रयास कर रहा हूं। मैंने फ़ाइल को वांछित स्थान पर सहेजने में कामयाब रहा है (नामक फ़ोल्डर अपलोड करता है)।Multer का उपयोग कर अपलोड की गई फ़ाइल का नाम बदलना (Express.js)

5257ee6b035926ca99923297c224a1bb

हेक्साडेसिमल समय स्टाम्प हो सकता है:

हालांकि, मैं थोड़ी देर है, क्योंकि यह अपलोड करने डिफ़ॉल्ट रूप से फ़ाइल का नाम बदलें करना चाहते हैं, Multer यह इस तरह के रूप में एक अजीब नाम देता है या तो मुझे बाद में एक स्क्रिप्ट कॉल करने के लिए मुझे एक और स्पष्ट नाम की आवश्यकता है।

मैंने here को स्पष्टीकरण का पालन किया है, लेकिन यह हेक्सा नाम के साथ फ़ाइल अपलोड करने से कहीं अधिक कुछ नहीं करता है।

इसके अलावा, दो घटनाओं onFileUploadStart और onFileUploadComplete ट्रिगर किए जाने वाले के रूप में मैं करने के लिए कुछ भी मेरे कंसोल में लॉग इन नहीं है कभी नहीं लग रहे हैं।

मैं सर्वर के लिए दो अलग-अलग फ़ाइलों और मार्ग का उपयोग कर रहा:

app.js

/** 
* Dependencies 
*/ 

var express = require('express'); 
var path = require('path'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 

/** 
* Importation of routes 
*/ 
var routes = require('./routes/index'); 
var recog = require('./routes/recog'); 

/** 
* Express 
*/ 
var app = express(); 

app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: false})); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 

// pour contrer les erreurs de cross domain 
app.use(function (req, res, next) { 

    // Website you wish to allow to connect 
    res.setHeader('Access-Control-Allow-Origin', '*'); 

    // Request methods you wish to allow 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); 

    // Request headers you wish to allow 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); 

    // Set to true if you need the website to include cookies in the requests sent 
    // to the API (e.g. in case you use sessions) 
    res.setHeader('Access-Control-Allow-Credentials', true); 

    // Pass to next layer of middleware 
    next(); 
}); 

/** 
* Routes 
*/ 
app.use('/', routes); 
app.use('/recog', recog); 

module.exports = app; 

recog.js

/** 
* Requirements 
*/ 
var express = require('express'); 
var router = express.Router(); 
var multer = require('multer'); 
var uploads = multer({ 
    dest: 'uploads/', 
    rename: function (fieldname, filename) { 
     console.log("Rename..."); 
     return filename + Date.now(); 
    }, 
    onFileUploadStart: function() { 
     console.log("Upload is starting..."); 
    }, 
    onFileUploadComplete: function() { 
     console.log("File uploaded"); 
    } 
}); 

/** 
* Upload d'une image 
*/ 
router.post('/upload', uploads.single('image'), function (req, res, next) { 
    console.log("Front-end is calling"); 
    res.json({status: 'success', data: 'Fichier chargé.\nOrgane sélectionné : ' + req.body.organ}); 
}); 

module.exports = router; 

मैं हा मैं चारों ओर खुदाई कर रहा हूं लेकिन मुझे पता नहीं चल रहा है कि समस्या क्या है क्योंकि मैं सामान्य रूप से Node.js और जावास्क्रिप्ट के लिए काफी नया हूं।

आपकी मदद लोगों के लिए धन्यवाद!

उत्तर

17

मुलटर के लिए उपयोग बदल गया है।

  1. जिले/भंडारण
  2. fileFilter
  3. सीमा

अब नाम बदलने, onFileUploadStart, onFileUploadComplete काम नहीं होगा:

वर्तमान में Multer निर्माता केवल तीन विकल्प स्वीकार करता है।

तथापि नाम DiskStorage

उपयोग किया जा सकता
var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
     cb(null, '/tmp/my-uploads') 
    }, 
    filename: function (req, file, cb) { 
     cb(null, file.fieldname + '-' + Date.now()) 
    } 
}) 

var upload = multer({ storage: storage }) 

इन कड़ियों पर एक नजर है:

1

व्यक्तिगत तौर पर मैं निम्नलिखित समाधान, लागू किया जो फ़ाइलों के लिए एक यादृच्छिक नाम उत्पन्न करता है और मूल फ़ाइल एक्सटेंशन जोड़ता है (मुझे लगता है कि मेरा एक्सटेंशन अंतिम के बाद है।)

var path = require('path'); 

    var options = multer.diskStorage({ destination : 'uploads/' , 
     filename: function (req, file, cb) { 
     cb(null, (Math.random().toString(36)+'00000000000000000').slice(2, 10) + Date.now() + path.extname(file.originalname)); 
     } 
    }); 

    var upload= multer({ storage: options }); 

    router.post('/cards', upload.fields([{ name: 'file1', maxCount: 1 }, { name: 'file2', maxCount: 1 }]), function(req, res, next) { 
    /* 
     handle files here 
     req.files['file1']; //First File 
     req.files['file2']; //Second File 
     req.body.fieldNames;//Other Fields in the form 

    */ 
    }); 


MULTER प्रलेखन आप इस मिल जाएगा में:

डिस्क भंडारण इंजन आप डिस्क के लिए फ़ाइलों को संग्रहीत करने पर पूर्ण नियंत्रण देता है।

दो उपलब्ध विकल्पों में, गंतव्य और फ़ाइल नाम रहे हैं। वे दोनों कार्य हैं जो निर्धारित करते हैं कि फ़ाइल कहां संग्रहीत की जानी चाहिए।

नोट: आप निर्देशिका बनाते समय एक समारोह के रूप गंतव्य प्रदान करने के लिए जिम्मेदार हैं। एक स्ट्रिंग पास करते समय, मल्टर सुनिश्चित करेगा कि निर्देशिका आपके लिए बनाई गई है।

फ़ाइल नाम का उपयोग यह निर्धारित करने के लिए किया जाता है कि फ़ोल्डर के अंदर फ़ाइल का नाम क्या होना चाहिए। यदि कोई फ़ाइल नाम नहीं दिया गया है, तो प्रत्येक फ़ाइल को यादृच्छिक नाम दिया जाएगा जिसमें कोई भी फ़ाइल एक्सटेंशन शामिल नहीं है।

नोट: मुलटर आपके लिए कोई फ़ाइल एक्सटेंशन नहीं जोड़ देगा, आपका फ़ंक्शन फ़ाइल एक्सटेंशन के साथ एक फ़ाइल नाम पूर्ण करना चाहिए।

4

मुझे पता है कि यह पोस्ट दिनांकित है। मैं उन लोगों में योगदान देना चाहता हूं जो बाद में आ सकते हैं। यादृच्छिक सहेजे गए चित्रों के नाम और फ़ाइल एक्सटेंशन के साथ एकाधिक अपलोड किए गए चित्रों को संभालने के लिए नीचे एक पूर्ण कार्यात्मक सर्वर स्क्रिप्ट है।

var express = require("express"); 
var multer = require("multer"); 
var app = express(); 
var path = require("path"); 
var uuid = require("uuid"); 

// Allow cross origin resource sharing (CORS) within our application 
app.use(function(req, res, next) { 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
    next(); 
}); 

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
    cb(null, 'uploadedimages/') 
    }, 
    filename: function (req, file, cb) { 
    cb(null, uuid.v4() + path.extname(file.originalname)); 
    } 
}) 

var upload = multer({ storage: storage }) 

// "files" should be the same name as what's coming from the field name on the client side. 
app.post("/upload", upload.array("files", 12), function(req, res) { 
    res.send(req.files); 
    console.log("files = ", req.files); 
}); 

var server = app.listen(3000, function() { 
    console.log("Listening on port %s...", server.address().port); 
}); 
3

हम तारीख की मदद से फाइल करने के लिए एक यादृच्छिक नाम देने के लिए और file.mimetype

कोशिश console.log (file.mimetype) की मदद से मूल फाइल एक्सटेंशन संलग्न कर देता है आप फ़ाइल नाम और एक्सटेंशन मिल जाएगा '/' से अलग किया गया है, तो मैं इसे सरणी में विभाजित करता हूं और विस्तार से इसे प्राप्त करता हूं। नीचे दिए गए कोड को आज़माएं।

let storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
    cb(null, './uploads') 
    }, 
    filename: function (req, file, cb) { 
    let extArray = file.mimetype.split("/"); 
    let extension = extArray[extArray.length - 1]; 
    cb(null, file.fieldname + '-' + Date.now()+ '.' +extension) 
    } 
}) 
const upload = multer({ storage: storage }) 
+0

बिल्कुल आपका धन्यवाद! –

2

इस तरह से जो मैं

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
     cb(null, 'uploads/') 
    }, 
    filename: function (req, file, cb) { 
     console.log(file); 
     var fileObj = { 
     "image/png": ".png", 
     "image/jpeg": ".jpeg", 
     "image/jpg": ".jpg" 
     }; 
     if (fileObj[file.mimetype] == undefined) { 
     cb(new Error("file format not valid")); 
     } else { 
     cb(null, file.fieldname + '-' + Date.now() + fileObj[file.mimetype]) 
     } 
    } 
    }) 

    var upload = multer({ storage: storage }) 
0

फ़ाइल उपयोग कर रहा हूँ इस तरह संरचना है कोशिश:

{ 
"fieldname": "avatar", 
"originalname": "somefile.pdf", 
"encoding": "7bit", 
"mimetype": "application/pdf", 
"destination": "./uploads", 
"filename": "36db44e11b83f4513188f649ff445a2f", 
"path": "uploads\\36db44e11b83f4513188f649ff445a2f", 
"size": 1277191 

}

अगले उदाहरण बचाता है इसके साथ फ़ाइल मूल नाम एक है विस्तार और अजीब नाम के साथ यह डिफ़ॉल्ट रूप से नहीं है। ("file.originalname" के बजाय आप इसे जितना चाहें सहेज सकते हैं)

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
    cb(null, './uploads') //Destination folder 
    }, 
    filename: function (req, file, cb) { 
    cb(null, file.originalname) //File name after saving 
    } 
}) 

var upload = multer({ storage: storage }) 
+0

जबकि यह कोड स्निपेट प्रश्न हल कर सकता है, [एक स्पष्टीकरण सहित] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जानते हैं। – Clijsters

संबंधित मुद्दे