2015-07-23 12 views

Odpowiedz

20

Z dokumentów: "Multer nie doda dla ciebie żadnego rozszerzenia pliku, twoja funkcja powinna zwrócić nazwę pliku z rozszerzeniem pliku."

Oto w jaki sposób można dodać rozszerzenie:

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 }); 

Polecam pomocą właściwości mimetype określić rozszerzenie. Na przykład:

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

Więcej informacji: https://github.com/expressjs/multer

+0

Dzięki za to, pracował jak czar .... – user3355603

+0

śledzę tego, ale moje pliki są przesyłane na dysku C: z mojego komputera na podstawie przesłanych folder.how aby zapisać je w moim katalogu projektu. – jsgeek

+0

@kisor, którego szukasz [nazwa_domeny] (https://nodejs.org/docs/latest/api/globals.html#globals_dirname) – Scott

19

Niestety, nie mogę wypowiedzieć się na temat odpowiedzi udzielonej przez Scotta powyżej ale mam obejście dla dodanie właściwego rozszerzenia plików. Jeśli używasz path modułu Node

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

To jest najlepsze rozwiązanie – aidonsnous

7

Mam plik z rozszerzeniem z file.mimetype. Rozdzielam typ MIME i otrzymuję od niego rozszerzenie pliku Proszę wypróbować poniższą funkcję.

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

Wystąpił problem z tym rozwiązaniem, jeśli próbujesz przesłać plik .docx niż ten sposób nie powiedzie się –

0

W 2018 roku, odbywa się zrobić tak:

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

robie jak ten

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

Nie mogą być pewne problemy w już odpowiedzieli kodów.

  • Może być kilka przypadków plików bez rozszerzenia.
  • Nie powinno być używane użycie urządzenia . Jego jest podatne na ataki osób atakujących.
  • Funkcja przesyłania nie powinna być globalna .

Napisałem poniższe kody dla lepszego bezpieczeństwa.

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 }); 

Używanie go do przesłania

// 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

Dziękuję za twoje dane wejściowe, ale to nie odpowiada na pytanie.Rozważ umieszczenie nowego pytania i samodzielną odpowiedź, jeśli chcesz zapisać tę wiedzę na StackOverflow. Przeczytaj także sekcję pomocy, zanim to zrobisz. – Graham

Powiązane problemy