Загрузка файлов с помощью Express 4.0: req.файлы не определены
Я пытаюсь получить простой механизм загрузки файлов, работающий с 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');
});
.. и сопутствующий Нефритовый код:
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');
});
});
});
6 ответов:
The
body-parserмодуль обрабатывает только JSON и urlencoded формы представления, а не multipart (что было бы в случае, если вы загружаете файлы).для multipart, вам нужно будет использовать что-то вроде
connect-busboyилиmulterилиconnect-multiparty(multiparty / formidable-это то, что первоначально использовалось в промежуточном программном обеспечении express bodyParser). Также FWIW, я работаю над еще более высоким уровнем слоя поверх busboy называетсяreformed. Он поставляется с Экспресс-middleware, а также может использоваться отдельно.
вот что я нашел в гугле:
var fileupload = require("express-fileupload");который является довольно простым механизмом для загрузки
app.post("/upload", function(req, res) { var file; if(!req.files) { res.send("File was not found"); return; } file = req.files.FormFieldName; // here is the field name of the form file.mv("file.txt", function(err) //Obvious Move function { // log your error }); res.send("File Uploaded"); });
похоже
body-parserсделал поддержка загрузки файлов в Express 3, но поддержка была удалена для Express 4, когда он больше не входит подключение как зависимостьпросмотрев некоторые модули в ответе mscdex, я обнаружил, что
express-busboyбыла гораздо лучшей альтернативой и ближе всего к замене капли. Единственные различия, которые я заметил, были в свойствах загруженного файла.
console.log(req.files)используя body-parser (Express 3) выведите объект, который выглядел так:{ file: { fieldName: 'file', originalFilename: '360px-Cute_Monkey_cropped.jpg', name: '360px-Cute_Monkey_cropped.jpg' path: 'uploads/6323-16v7rc.jpg', type: 'image/jpeg', headers: { 'content-disposition': 'form-data; name="file"; filename="360px-Cute_Monkey_cropped.jpg"', 'content-type': 'image/jpeg' }, ws: WriteStream { /* ... */ }, size: 48614 } }по сравнению с
console.log(req.files)используя экспресс-помощника (Экспресс-4):{ file: { field: 'file', filename: '360px-Cute_Monkey_cropped.jpg', file: 'uploads/9749a8b6-f9cc-40a9-86f1-337a46e16e44/file/360px-Cute_Monkey_cropped.jpg', mimetype: 'image/jpeg', encoding: '7bit', truncated: false uuid: '9749a8b6-f9cc-40a9-86f1-337a46e16e44' } }
мултэр это промежуточное программное обеспечение, которое обрабатывает "multipart / form-data" и волшебно & делает загруженные файлы и данные формы доступными для нас в запросе как запрос.файлы и запрос.тело.
установка multer : -
npm install multer --savein .html файл: -
<form method="post" enctype="multipart/form-data" action="/upload"> <input type="hidden" name="msgtype" value="2"/> <input type="file" name="avatar" /> <input type="submit" value="Upload" /> </form>in .файл JS:-
var express = require('express'); var multer = require('multer'); var app = express(); var server = require('http').createServer(app); var port = process.env.PORT || 3000; var upload = multer({ dest: 'uploads/' }); app.use(function (req, res, next) { console.log(req.files); // JSON Object next(); }); server.listen(port, function () { console.log('Server successfully running at:-', port); }); app.get('/', function(req, res) { res.sendFile(__dirname + '/public/file-upload.html'); }) app.post('/upload', upload.single('avatar'), function(req, res) { console.log(req.files); // JSON Object });надеюсь, что это помогает!
ПРОБЛЕМА РЕШЕНА !!!!!!!
получается
storageфункция не выполнялась ни разу. потому что я должен был включитьapp.use(upload)какupload = multer({storage}).single('file');let storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './storage') }, filename: function (req, file, cb) { console.log(file) // this didn't print anything out so i assumed it was never excuted cb(null, file.fieldname + '-' + Date.now()) } }); const upload = multer({storage}).single('file');
express-fileuploadпохоже, единственное промежуточное ПО, который все еще работает в эти дни.С тем же примером,
multerиconnect-multipartyдает неопределенное значение req.файл или req.файлы, аexpress-fileuploadстроительство.и есть много вопросов и проблем, связанных с пустым значением req.файл/Треб.файлы.
Comments