下面是使用'connect-busboy'模块的简单文件上传实现的参考。我正在使用带有Backbone前端结构的Express设置。
File uploading with Express 4.0: req.files undefined
我尝试使用上面的方法来创建简单的文件上传,并且我一直收到此错误:
_stream_readable.js:483
dest.end();
^
TypeError: Cannot call method 'end' of undefined
at IncomingMessage.onend (_stream_readable.js:483:10)
at IncomingMessage.g (events.js:180:16)
at IncomingMessage.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:920:16
at process._tickCallback (node.js:415:13)
做一些研究我得到的修正与我的代码无关。我完全按照上面的定义实现了这个解决方案,但我没有使用Jade模板构建器。另外,我从localhost运行节点服务器。这会引起问题吗?
如果有人能提供帮助那就太棒了。谢谢!
P.S。我复制并粘贴原始代码只更改路由和结束重定向,其中两者都没有导致问题(服务器正确地看到请求通过路由进入,并且它永远不会到达重定向,因为没有控制台日志是输出
编辑 - 添加以下代码
server.js route
var express = require('express');
var fs = require('fs');
var busboy = require('connect-busboy');
...
app.use(busboy());
...
app.post('/list', function(req, res) {
console.log("HIT - hasher!");
var fstream;
req.pipe(req.busboy);
req.busboy.on('file', function (fieldname, file, filename) {
console.log("Uploading: " + filename);
fstream = fs.createWriteStream(__dirname + '/uploads/' + filename);
file.pipe(fstream);
fstream.on('close', function () {
res.redirect('lists');
});
});
});
list.html模板
<form enctype="multipart/form-data" action="../list/" method="post" data-abide>
...
<span id="ulbtnview">File Upload</span>
<input id="uplbtn" type="file" class="upload" required>
<small class="error">A valid list file is required.</small>
...
<div class="large-5 columns">
<input id="uploadfile" type="submit" class="button" value="Submit" style="padding-right: 1.5rem; padding-left: 1.5rem; padding-top: 0.5rem; padding-bottom: 0.6rem;"></div>
...
</form>
解
问题是我的输入元素需要'name'属性。没有它,表单将处理,但不会将数据发送到服务器。
这
<input id="uplbtn" type="file" class="upload" required>
到
<input id="uplbtn" type="file" class="upload" name="file-new" required>
http://www.w3.org/TR/html401/interact/forms.html#successful-controls
答案 0 :(得分:0)
我有类似的情况,我得到同样的错误。在放app.use(busboy());
之前我错误地定义了我的路由器。在我改变之后,代码确实完美无缺。