2015-09-18 5 views
4

Сохраняя имя файла изображения и расширение после загрузки в Node.js (экспресс) с использованием multer

<!doctype html> 
 
<html> 
 

 
    <body> 
 
     <form action="/upload" method="POST" enctype="multipart/form-data"> 
 
      <input type='file' name="image"> 
 
      <br> 
 
      <input type="submit" value="submit"> 
 
     </form> 
 
    </body> 
 

 
</html>

var express = require('express'); 
var router = express.Router(); 
var multer = require('multer'); 
var upload = multer({ dest: 'uploads/', 
    filename: function (req, file, cb) { 
    cb(null, file.fieldname + '-' + Date.now()) 
} }); 

router.post('/upload', upload.single('image'), function(req, res){ 
    res.send("Uploaded"); 
}); 
module.exports = router; 

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

+0

FWIW вы не можете полагаться на расширениях файлов для произвольного добавляемого пользователя. Вы можете изучить модуль, например ['mmmagic'] (https://github.com/mscdex/mmmagic), который проверяет содержимое файла для определения типа файла. – mscdex

ответ

8

при загрузке файла (используя multer.single метод), вы получите данные файла в

req.file 

это объект, который имеет в свойствах ORIGINALNAME, тип_mime, путь и другие. Проверьте документы для всех: https://github.com/expressjs/multer

Но не доверяйте mimetype.

Как сохранить имя и расширение имени?

а) переименовать загруженный файл, используя данные в req.file (не люблю его)

данные б) хранить файлы (req.file) в дБ

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

Следующая вещь: Orginal имена файлов могут иметь оскорбительные слова или не стандартных символов (я не знаю, если это может быть isue безопасности) или быть очень длинным и т.д.

хорошо, как переименовать? мы можем использовать экспресс-пакет фс https://nodejs.org/api/fs.html и методов:

fs.rename(oldPath, newPath, callback) 

или

fs.renameSync(oldPath, newPath) 
+0

Хорошо, спасибо за ваш ответ. Теперь я получаю больше. Мне нравится идея сохранить оригинальное имя изображения в db, но просто из любопытства, так как я новичок в этом, как вы переименовываете? req.file.originalname =? –

+0

Я редактирую свой ответ, чтобы принять во внимание ваш комментарий –

+0

метод переименования также может перемещать файлы в разные каталоги –