Как сохранить файл с расширением с помощью multer?

удалось сохранить мои файлы в папке, но они хранят без расширения файла.

кто-нибудь знает, как я буду хранить файл с расширением файла?

7 ответов


из документов: "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


Извините, я не могу прокомментировать ответ Скотта выше, но у меня есть обходной путь для добавления надлежащего расширения файлов. Если вы используете 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 });

Я получил расширение файла от 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 })

в 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();

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

  • могут быть некоторые случаи файлы без расширения.
  • не должно быть 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");
})

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

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

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

const crypto = require('crypto')
let upload = multer({
storage: multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, path.join(__dirname, '../uploads'))
    },
    filename: (req, file, cb) => {
        let customFileName = crypto.randomBytes(18).toString('hex')
        let fileExtension = file.originalname.split('.')[1] // get file extension from original file name
        cb(null, customFileName + '.' + fileExtension)
    }
  })
})