我正在尝试使用node.js作为后端并将angular.js作为前端上传文件到服务器.我正在使用快递4 + busboy.我在前端有一张桌子,我应该显示我正在上传的所有文件.因此,如果我有3个文件并单击上传,angular应该将这些文件发布到node.js,并在获得响应后,使用这三个文件刷新表.这是我在角度中使用的功能:
function uploadFiles(files){
var fd = new FormData();
for(var i = 0; i<files.length; i++){
fd.append("file", files[i]);
}
$http.post('http://localhost:3000/upload', fd, {
withCredentials: false,
headers: {'Content-Type': undefined },
transformRequest: angular.identity
}).success(refreshTable()).error(function(){
console.log("error uploading");
});
}
Run Code Online (Sandbox Code Playgroud)
这是来自node.js:
app.post('/upload', function(req, res) {
var busboy = new Busboy({ headers: req.headers });
busboy.on('file', function (fieldname, file, filename) {
console.log("Uploading: " + filename);
var fstream = fs.createWriteStream('./files/' + filename);
file.pipe(fstream);
});
busboy.on('finish', function(){
res.writeHead(200, { 'Connection': 'close' });
res.end("");
});
return req.pipe(busboy);
});
Run Code Online (Sandbox Code Playgroud)
问题是,如果我上传了三个文件,一旦上传了第一个文件,node.js就会发送响应,因此只有上传的第一个文件才会更新表,如果我刷新页面,其余的文件会出现.我认为问题在于节点中的这一行:return req.pipe(busboy); 如果我删除该行,后期响应将持续很长时间没有任何反应,我认为这是一个异步问题,任何人都知道是否有办法只在所有文件上传后才发回响应?谢谢
解决此特定问题的一个简单而常见的解决方案是使用计数器变量并finish
在fs Writable流上侦听事件.例如:
app.post('/upload', function(req, res) {
var busboy = new Busboy({ headers: req.headers });
var files = 0, finished = false;
busboy.on('file', function (fieldname, file, filename) {
console.log("Uploading: " + filename);
++files;
var fstream = fs.createWriteStream('./files/' + filename);
fstream.on('finish', function() {
if (--files === 0 && finished) {
res.writeHead(200, { 'Connection': 'close' });
res.end("");
}
});
file.pipe(fstream);
});
busboy.on('finish', function() {
finished = true;
});
return req.pipe(busboy);
});
Run Code Online (Sandbox Code Playgroud)
这样做的原因是,finish
一旦整个请求被完全处理(包括文件),就会发出busboy的事件.但是,在没有更多数据写入特定文件和OS /节点将其内部缓冲区刷新到磁盘(以及关闭文件描述符)之间存在一些延迟.通过侦听finish
fs可写流的事件,您可以知道文件描述符已关闭,不会再发生写入.
归档时间: |
|
查看次数: |
4003 次 |
最近记录: |