Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用Express 4.0上载文件:未定义req.files_Node.js_Express - Fatal编程技术网

Node.js 使用Express 4.0上载文件:未定义req.files

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

我正在尝试使用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: 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)
as
upload=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/
目录,否则你上传后会出现错误。临时文件是如何处理的?巴士司机会自动删除它们吗?我只是看不到在保存到磁盘之前删除任何临时文件。对于大文件来说太慢了你不知道se
fileupload
?要使上述答案起作用,您需要在主
app.js
const 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){

...

});