Node.js 使用Express 4.0上载文件:未定义req.files
我正在尝试使用Express 4.0获得一个简单的文件上载机制,但我一直在Node.js 使用Express 4.0上载文件:未定义req.files,node.js,express,Node.js,Express,我正在尝试使用Express 4.0获得一个简单的文件上载机制,但我一直在app.post正文中获得req.files的未定义的。以下是相关代码: var bodyParser = require('body-parser'); var methodOverride = require('method-override'); //... app.use(bodyParser({ uploadDir: path.join(__dirname, 'files'), keepExtensions: t
app.post
正文中获得req.files
的未定义的。以下是相关代码:
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")
解决方案
感谢下面的回复,我已经切换到使用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');
});
});
});
该模块仅处理JSON和urlencoded表单提交,而不是多部分提交(如果您正在上载文件,则会出现这种情况)
对于multipart,您需要使用类似或的东西(multiparty/forgible是最初在expressbodyparser中间件中使用的东西)。同样是FWIW,我正在一个更高的层次上工作的巴士男孩称为。它附带了一个Express中间件,也可以单独使用。它看起来像是主体解析器
支持在Express 3中上载文件,但在Express 4启用时,它的支持被取消了
在浏览了mscdex答案中的一些模块后,我发现这是一个更好的选择,最接近于替代品的下降。我注意到的唯一区别是上传文件的属性
console.log(req.files)
使用主体解析器(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 } }
与使用express busboy(express 4)的console.log(请求文件)
相比:
以下是我在谷歌上搜索到的内容:
var fileupload = require("express-fileupload");
app.use(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
res.send("File Uploaded");
});
expressfileupload
看起来是目前唯一仍然有效的中间件
在同一示例中,multer
和connect multiparty
给出了未定义的req.file或req.files值,但express fileupload
有效
关于req.file/req.files的空值有很多问题和疑问。是一个中间件,它处理“多部分/表单数据”,并神奇地将上传的文件和表单数据作为request.files和request.body提供给我们
安装multer:-npm安装multer--save
在.html文件中:-
在.js文件中:-
var express=require('express');
var multer=需要('multer');
var-app=express();
var server=require('http')。createServer(应用程序);
var port=process.env.port | 3000;
var upload=multer({dest:'uploads/'});
应用程序使用(功能(请求、恢复、下一步){
console.log(req.files);//JSON对象
next();
});
侦听(端口、函数(){
console.log('服务器在:-'端口成功运行);
});
app.get('/',函数(req,res){
res.sendFile(uu dirname+'/public/file upload.html');
})
app.post('/upload',upload.single('avatar'),函数(req,res){
console.log(req.files);//JSON对象
});
希望这有帮助 问题解决了强>
原来存储
功能甚至没有运行一次。
因为我必须包括app.use(upload)
asupload=multer({storage}).single('file')代码>
请使用下面的代码
app.use(fileUpload());
1) 确保您的文件确实是从客户端发送的。例如,您可以在Chrome控制台中进行检查:
2) 以下是NodeJS后端的基本示例:
const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();
app.use(fileUpload()); // Don't forget this line!
app.post('/upload', function(req, res) {
console.log(req.files);
res.send('UPLOADED!!!');
});
只需添加到上面的答案中,您就可以将express fileupload
的使用简化为只需要它的单个路由,而不是将它添加到每个路由中
let fileupload = require("express-fileupload");
...
app.post("/upload", fileupload, function(req, res){
...
});
谢谢,成功了。虽然我不得不使用connect-busboy
而不仅仅是busboy
。用解决方案更新了我原来的帖子。谢谢你,伙计!我发现connectmultiparty
选项是最好的选择!是否仍在开发中?您在github上的最后一次提交是在2014年……顺便问一下,您认为处理多部分表单数据的最佳模块是什么?我说的“最佳”是指受支持最好、工作更好(bug更少)、功能更多、未来更长……我选择了multer
,因为它似乎是受支持最好的,但我仍然认为它应该得到更多支持。[编辑:没问题,只是看到了下面的答案。]在express 3.0中使用了multipart,然后在4.0中中断了吗?我这样问是因为本教程使用3.4.8,可以上传文件,而不需要任何额外的中间件@ThetryStoro-github repo,因为您链接到的特定示例实际上已将依赖项检查到repo中。如果您深入研究这些依赖项,您将看到包含了Express 3.x,以及Connect 2.x(它仍然捆绑了一个多部分模块)。这就是为什么多部分处理“开箱即用”的原因。这如何处理多个文件?@chovy它应该可以处理多个文件我认为可以执行app.post('/fileupload',busboy(),function(req,res){很好的解决方案我只是想指出,你必须在你的应用程序的主目录中创建一个/files/
目录,否则你上传后会出现错误。临时文件是如何处理的?巴士司机会自动删除它们吗?我只是看不到在保存到磁盘之前删除任何临时文件。对于大文件来说太慢了你不知道sefileupload
?要使上述答案起作用,您需要在主app.jsconst fileupload=require('express-fileupload')应用程序中添加这两行。使用(fileupload())
var fileupload=require(“express fileupload”);应用程序。使用(fileupload());
const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();
app.use(fileUpload()); // Don't forget this line!
app.post('/upload', function(req, res) {
console.log(req.files);
res.send('UPLOADED!!!');
});
let fileupload = require("express-fileupload");
...
app.post("/upload", fileupload, function(req, res){
...
});