使用node.js上载文件时出错

Error uploading file with node.js

本文关键字:出错 文件 上载 node js 使用      更新时间:2023-09-26

使用下面的代码,当我尝试上传文件时,浏览器会一直加载。知道为什么吗?

app.js

var formidable = require('formidable'),
    http = require('http'),
    util = require('util');
app.get('/song/add', function (req, res) {
    res.writeHead(200, {'content-type': 'text/html'});
    res.end(
        '<form action="/song/upload" enctype="multipart/form-data" method="post">'+
        '<input type="text" name="title"><br>'+
        '<input type="file" name="upload" multiple="multiple"><br>'+
        '<input type="submit" value="Upload">'+
        '</form>'
    );
});
app.post('/song/upload', function (req, res) {
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, files) {
        res.writeHead(200, {'content-type': 'text/plain'});
        res.write('received upload:'n'n');
        res.end(util.inspect({fields: fields, files: files}));
    });
    return;
});

只要删除代码中的那一行(app.use(express.bodyParser())),我相信这应该会起作用。

但是你为什么要用可怕的?我相信express body解析器是基于强大的,而且使用起来更干净。由于它甚至解析其他类型的主体,除了JSON之类的表单类型之外,但如果主体类型不受支持,它将抛出错误。如果你的代码中有app.use(express.bodyParser()),那么你可以这样做来获得你想要的:

app.post('/song/upload', function(req, res){
    res.writeHead(200, {'content-type': 'text/plain'});
    res.write('received upload:'n'n');
    res.end(util.inspect(req.body));
    return;
 });

您可能已经打开了express body解析器选项。请检查您的配置以了解以下内容:

app.use(express.bodyParser())

我认为问题是Formidable期望这个文件的流事件&在调用app.post回调时,它们已经被Express消耗掉了。由于form.parse回调仅在end上触发,因此从不呈现任何响应。

解决方案是使用Express或Formidable,如果您想使用Formidable则可以禁用配置选项。

我在这里看到的问题是新的body解析器(自Connect 1.8.0以来)。如果你想使用强大的新Connect,你需要从body解析器中删除多部分解析器:

delete express.bodyParser.parse['multipart/form-data'];

不要在Express4.x中使用bodyParser:http://andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html

使用

app.use(express.json());

app.use(express.urlencoded());

相反。代码的问题在于,您将在调用回调之前返回,因此不会将结果发送给用户。

将您的代码更改为:

返回res.end(util.vinspect({fields:fields,files:files}));

并在末端移除返回。