gpt4 book ai didi

node.js - busboy - 有没有办法在所有文件都上传后发送响应?

转载 作者:搜寻专家 更新时间:2023-10-31 22:41:02 24 4
gpt4 key购买 nike

我正在尝试使用 node.js 作为后端和 angular.js 作为前端将文件上传到服务器。我为此使用 express 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");
});
}

这是来自 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);
});

问题是,如果我上传三个文件,一旦第一个文件上传,node.js 就会发送响应,因此表只更新第一个上传的文件,如果我刷新页面,其余的文件出现。我认为问题出在 Node 中的这一行:return req.pipe(busboy);如果我删除该行,帖子响应会长时间挂起并且没有任何反应,我认为这是一个异步问题,有人知道是否有办法仅在所有文件都已上传后才发回响应?谢谢

最佳答案

针对此特定问题的一个简单且常见的解决方案是使用计数器变量并监听 fs 可写流上的 finish 事件。例如:

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);
});

这样做的原因是,一旦整个请求(包括文件)得到完全处理,busboy 的 finish 事件就会发出。但是,在没有更多数据可写入特定文件与操作系统/Node 将其内部缓冲区刷新到磁盘(以及文件描述符关闭)之间存在一些延迟。监听 fs 可写流的 finish 事件让您知道文件描述符已关闭并且不会再进行写入。

关于node.js - busboy - 有没有办法在所有文件都上传后发送响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29996657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com