Я пытаюсь получить простую загрузку файла механизм работать с Express 4.0 , но я получаю undefined
за req.files
в app.post
организме. Вот соответствующий код:
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
//...
app.use(bodyParser({ uploadDir: path.join(__dirname, 'files'), keepExtensions: true }));
app.use(methodOverride());
//...
app.post('/fileupload', function (req, res) {
console.log(req.files);
res.send('ok');
});
.. и сопровождающий код Pug:
form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data")
input(type="file", name="file", id="file")
input(type="submit", value="Upload")
Решение
Благодаря ответу mscdex ниже, я переключился на использование busboy
вместо bodyParser
:
var fs = require('fs');
var busboy = require('connect-busboy');
//...
app.use(busboy());
//...
app.post('/fileupload', function(req, res) {
var fstream;
req.pipe(req.busboy);
req.busboy.on('file', function (fieldname, file, filename) {
console.log("Uploading: " + filename);
fstream = fs.createWriteStream(__dirname + '/files/' + filename);
file.pipe(fstream);
fstream.on('close', function () {
res.redirect('back');
});
});
});
./files/
каталог в домашнем каталоге вашего приложения, в противном случае вы получите ошибку после загрузки.Ответы:
body-parser
Модуль обрабатывает только JSON и urlencoded формы представления, не многослойный (что было бы в случае , если вы загружаете файлы).Для multipart вам нужно использовать что-то вроде
connect-busboy
илиmulter
илиconnect-multiparty
(multiparty / formidable - это то, что изначально использовалось в промежуточном программном обеспечении Express bodyParser). Также FWIW, я работаю над еще более высокоуровневым слоем поверх busboy коллаreformed
. Он поставляется с промежуточным программным обеспечением Express, а также может использоваться отдельно.источник
connect-busboy
вместо простоbusboy
. Обновил мой оригинальный пост с решением.connect-multiparty
вариант лучшим из этих!reformed
еще в разработке? Ваш последний коммит на github - с 2014 года ... Кстати, по вашему мнению, какой модуль лучше всего обрабатывает данные из нескольких частей? Под «лучшим» я подразумеваю лучшую поддерживаемую и ту, которая работает лучше (с меньшим количеством ошибок), с большим количеством функций и с более длинным будущим. Я выбрал,multer
потому что это казалось наилучшей поддержкой, но я все еще думаю, что он должен быть более поддерживаемым.Вот что я нашел, погуглив:
Какой довольно простой механизм для загрузки
источник
fileupload
?app.js
const fileUpload = require('express-fileupload') app.use(fileUpload())
Похоже,
body-parser
он поддерживал загрузку файлов в Express 3, но поддержка Express 4 была прекращена, когда он больше не включал Connect в качестве зависимостиПросматривая некоторые из модулей в ответе mscdex, я обнаружил, что
express-busboy
это гораздо лучшая альтернатива и самая близкая вещь к замене. Единственные различия, которые я заметил, были в свойствах загруженного файла.console.log(req.files)
используя body-parser (Express 3) выведите объект, который выглядел так:по сравнению с
console.log(req.files)
использованием Express-Busboy (Express 4):источник
1) Убедитесь, что ваш файл действительно отправлен со стороны клиента. Например, вы можете проверить это в Chrome Console: скриншот
2) Вот основной пример серверной части NodeJS:
источник
multer - это промежуточное ПО, которое волшебным образом обрабатывает «multipart / form-data» и делает загруженные файлы и данные форм доступными для нас в запросе как request.files и request.body.
Установка Multer: -
npm install multer --save
в .html файле: -
в файле .js: -
Надеюсь это поможет!
источник
Пожалуйста, используйте ниже код
источник
ЗАДАЧА РЕШЕНА !!!!!!!
Оказывается,
storage
функция НЕ запускалась ни разу. потому что я должен был включитьapp.use(upload)
какupload = multer({storage}).single('file');
источник
express-fileupload
выглядит как единственное промежуточное программное обеспечение, которое все еще работает в наши дни.В том же примере
multer
иconnect-multiparty
дает неопределенное значение req.file или req.files , ноexpress-fileupload
работает.И есть много вопросов и проблем, связанных с пустым значением req.file / req.files .
источник