Multer gridfs Хранение
Я хотел изменить свое имя файла, но когда я изучаю console.log (req.file
) Я вижу имя файла, на которое я изменил, но другое имя файла сохраняется в базе данных с помощью Multergridfs Storage
,
1. the default filename
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err)
}
const filename = 'file' + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'contents'
};
resolve(fileInfo);
});
});
}});
2 this is where i edited the filename
router.post('/', upload.single('file'), (req, res) => {
req.file.filename = req.body.fileName + path.extname(req.file.originalname)
res.redirect('/upload/files')
console.log(req.file)
});
результат консоли что-то вроде
{fieldname: 'file', originalname: '\' ВЫ МОЖЕТЕ ТАКЖЕ БЫТЬ БОЛЬШИМ \ '- Элон Маск Мотивация - Мотивационный Video.mp4', кодировка: '7bit', mimetype: 'video/mp4', id: 5bfb292c13eec142f6c20fd9, имя файла: 'a.mp4', метаданные: null, имя_хранилища: 'содержимое', размер куска: 261120, размер: 19372377, md5: '513c6220ef3afff644cf8a6dc4cd9130', uploadDate: 2018-11-25T22:58:52.625Z, contentType: 'video/mp4 } { fileName: 'a' }
1 ответ
Эта часть в вашем коде
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => { // In this function is where you configure the name of your file
file
Конфигурация - это та, которая вычисляет имя файла перед вставкой файла в базу данных. Что вы делаете, это:
- Генерация имени как
'file'
плюс любое расширение, полученное из браузера, например:'file.mp4'
- Сохранение файла с таким именем в базе данных
- Перезапись свойства в вашем запросе новым именем
- Файл в базе данных остается без изменений
Я думаю, что вы действительно хотели, чтобы сгенерировать правильное имя перед вставкой
Вы можете сделать это с помощью
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err)
}
// In here you have access to the request and also to the body object
const filename = req.body.fileName + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'contents'
};
resolve(fileInfo);
});
});
}});
Убедитесь, что вы отправили все поля перед файлом из формы в вашем браузере, иначе некоторые значения будут undefined
потому что они еще не обработаны.