2015-07-23 3 views

ответ

20

Из документов: «Multer не добавит вам расширения для файлов, ваша функция должна вернуть имя файла в комплекте с расширением файла».

Вот как вы можете добавить расширение:

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

Я рекомендую использовать mimetype свойство для определения расширения. Например:

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

Подробнее: https://github.com/expressjs/multer

+0

спасибо за это, работал как шарм .... – user3355603

+0

я следить за этим, но мои файлы загружаются в C: диск моего компьютера под загрузки folder.how чтобы сохранить их в моей директории проектов. – jsgeek

+0

@kisor вы после [_dirname] (https://nodejs.org/docs/latest/api/globals.html#globals_dirname) – Scott

19

К сожалению, я не могу прокомментировать ответ на Скотта выше, но у меня есть обходной путь для добавления надлежащего расширения файлов. При использовании узлового модуля path

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

Это лучшее решение – aidonsnous

7

я получил файл с расширением от file.mimetype. Я разделил тип 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

Проблема с этим решением, если вы пытаетесь загрузить файл .docx, чем этот подход завершается –

0

В 2018 году, как это делается, как это сделано:

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

Я делаю как этот

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

Там могут быть некоторые проблемы в уже отвеченных кодов.

  • Там могут быть некоторые случаи файлов без расширения.
  • Не должно быть upload.any(). Его уязвим для злоумышленников
  • Функция загрузки должна быть не будет глобальной .

Я написал ниже для лучшей безопасности.

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

Использование его для загрузки

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

Спасибо за ваш вклад здесь, но это не отвечает на вопрос.Пожалуйста, подумайте о том, чтобы опубликовать новый вопрос и ответить на него самостоятельно, если вы хотите хранить эти знания в StackOverflow. Также прочитайте раздел справки, прежде чем вы это сделаете. – Graham

Смежные вопросы