2015-07-23 10 views

risposta

20

Dalla documentazione: "Multer non aggiungerà alcuna estensione di file per te, la tua funzione dovrebbe restituire un nome file completo con un'estensione di file".

Ecco come è possibile aggiungere l'estensione:

var multer = require('multer'); 

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
    cb(null, 'uploads/') 
    }, 
    filename: function (req, file, cb) { 
    cb(null, Date.now() + '.jpg') //Appending .jpg 
    } 
}) 

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

mi consiglia di utilizzare la proprietà mimetype per determinare l'estensione. Per esempio:

filename: function (req, file, cb) { 
    console.log(file.mimetype); //Will return something like: image/jpeg 

Maggiori informazioni: https://github.com/expressjs/multer

+0

grazie per questo, ha lavorato come un fascino .... – user3355603

+0

seguo questo, ma i miei file vengono caricati in C: l'azionamento del mio computer sotto arrivi folder.how per salvarli nella directory del mio progetto. – jsgeek

+0

@kisor che stai cercando [_dirname] (https://nodejs.org/docs/latest/api/globals.html#globals_dirname) – Scott

19

Mi dispiace, non posso commentare la risposta di Scott sopra, ma ho una soluzione per l'aggiunta corretta estensione dei file. Se si utilizza path modulo nodo

var multer = require('multer'); 
var path = require('path') 

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
    cb(null, 'uploads/') 
    }, 
    filename: function (req, file, cb) { 
    cb(null, Date.now() + path.extname(file.originalname)) //Appending extension 
    } 
}) 

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

Questa è la soluzione migliore – aidonsnous

7

ho ottenuto presentare l'estensione da file.mimetype. Ho diviso il mimetype e l'estensione del file da esso Si prega di provare la funzione qui sotto.

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

C'è un problema con questa soluzione se provi a caricare un file .docx rispetto a questo approccio fallisce –

0

Nel 2018, si è fatto fatto in questo modo:

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
     cb(null, config.DIR) 
    }, 
    filename: function (req, file, cb) { 
     let ext = file.originalname.substring(file.originalname.lastIndexOf('.'), file.originalname.length); 
     cb(null, Date.now() + ext) 
    } 
}); 
const upload = multer({ 
    storage: storage 
}).any(); 
0

sto facendo in questo modo

var multer = require('multer'); 

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
    cb(null, './public/uploads/img/') 
    }, 
    filename: function (req, file, cb) { 
    let ext = file.originalname.substring(file.originalname.lastIndexOf('.'), file.originalname.length); 
    cb(null, Date.now() + ext); 
    } 
}) 

var upload = multer({ storage: storage }).single('eventimage'); 
0

Ci possono essere alcuni problemi nei codici già risposto.

  • Ci possono essere alcuni casi di file senza estensione.
  • Non ci deve essere un utilizzo di upload.any(). È vulnerabile agli aggressori
  • La funzione di caricamento deve essere non globale .

Ho scritto i seguenti codici per una maggiore sicurezza.

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 

     cb(null, 'temp/') 
    }, 
    filename: function (req, file, cb) { 
     let ext = ''; // set default extension (if any) 
     if (file.originalname.split(".").length>1) // checking if there is an extension or not. 
      ext = file.originalname.substring(file.originalname.lastIndexOf('.'), file.originalname.length); 
     cb(null, Date.now() + ext) 
    } 
}) 
var upload = multer({ storage: storage }); 

Usandolo per l'upload

// using only single file object name (HTML name attribute) 
// May use upload.array(["file1","file2"]) for more than one 
app.post('/file_upload', upload.single("file"), function (req,res) { 
    //console.log(req.body, 'Body'); 
    console.log(req.file, 'file'); 
    res.send("cool"); 
}) 
+1

Grazie per l'input qui, ma questo non risponde alla domanda.Ti preghiamo di considerare di pubblicare una nuova domanda e di rispondere autonomamente se desideri memorizzare questa conoscenza su StackOverflow. Leggi anche la sezione di aiuto prima di farlo. – Graham