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 Конфигурация - это та, которая вычисляет имя файла перед вставкой файла в базу данных. Что вы делаете, это:

  1. Генерация имени как 'file' плюс любое расширение, полученное из браузера, например: 'file.mp4'
  2. Сохранение файла с таким именем в базе данных
  3. Перезапись свойства в вашем запросе новым именем
  4. Файл в базе данных остается без изменений

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

Вы можете сделать это с помощью

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 потому что они еще не обработаны.

Другие вопросы по тегам