Пользовательский файл Multer. Имя req.body.inputTextField в качестве имени файла. - PullRequest
0 голосов
/ 01 сентября 2018

Я не могу понять, как использовать req.body.fname в качестве имени для файла, даже пытался использовать промежуточное ПО, но req.body был пуст.

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, path);
  },
  filename: function (req, file, cb) {
    cb(null, req.body.fname)  // undefined 
  }
})
var upload = multer({ storage: storage })

app.get('/upload', upload.single('fname'), (req,res)=>{
  .......
})

i m unable to figure out how to fetch fname in fileName
index.html

<form action="/upload" method="POST" enctype= "multipart/form-data">
  <input type="text" name="fname">
  <input type="file" name="pic">
  <input type = "submit">
</form>

1 Ответ

0 голосов
/ 13 октября 2018

Это не элегантный способ, но лучше, чем ничего.


Что не может делать мультер

<ч /> Насколько я знаю, Малтер отправляет поля 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.

Надеюсь, это решит вашу проблему. Удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...