Это не элегантный способ, но лучше, чем ничего.
Что не может делать мультер
<ч />
Насколько я знаю, Малтер отправляет поля req.body только после отправки самого файла. Поэтому, когда вы называете файлы, у вас не будет доступа к полям. А так как для enctype установлено значение multipart, Body Parser также перестанет работать.
Где взять нужное тело
<ч />
Хотя поздно, Малтер все-таки отправляет поля req.body. Они будут доступны после загрузки файлов:
app.post('/upload', (req, res) => {
upload(req, res, function (err) {
console.log(req.body.fname) // Here it works
});
});
Простой обходной путь
<ч />
Теперь после загрузки изображения у нас есть файл с именем «undefined» (кстати, вы можете добавить расширение, я вернусь к этому позже), путь к которому мы можем получить через req.file.path. Поэтому теперь мы вызываем fs, чтобы переименовать его Это родной для Node.js, поэтому нет необходимости устанавливать. Просто потребуйте это перед использованием:
const fs = require('fs');
Затем мы вернемся к процессу загрузки.
app.post('/upload', (req, res) => {
upload(req, res, function (err) {
fs.renameSync(req.files.path, req.files.path.replace('undefined', req.body.fname));
// This get the file and replace "undefined" with the req.body field.
});
});
Я предполагаю, что у вашего пути к файлу нет папки с именем "undefined". В этом маловероятном случае просто назовите файл как-нибудь еще с помощью Multer и замените его позже на fs.renameSync.
Последний штрих: добавить расширение
<ч />
Если вы не планируете вводить расширение в поле ввода HTML, вы можете прикрепить расширение в процессе именования. Чтобы получить расширение, мы можем использовать путь, который также является родным для Node.js и должен быть только обязательным:
const path = require('path');
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, path);
},
filename: function (req, file, cb) {
cb(null, req.body.fname + path.extname(file.originalname))
}
})
Или в маловероятном случае, если вам нужно расширение ".undefined", просто присоедините расширение позже в процессе переименования fs.
Надеюсь, это решит вашу проблему. Удачного кодирования!