我正在使用 skipper 一次将多个文件上传到本地文件夹。但我遇到了一些问题。
upload: function (req, res) {
if (_.isEmpty(req.session.User)){
return res.json({ //---> 1
success: 0
});
}else{
res.setTimeout(0);
var MAXBYTES = 10*1000*1000;
//---> 2
if (req._fileparser.form.bytesExpected > MAXBYTES){
return res.json({
success: 0,
error: 'File size limit exceeded.'
});
}else{
req.file('file[]').on('progress', function(event){
return event; //---> 3
}).upload({
maxBytes: MAXBYTES
}, function whenDone(err, uploadedFiles) {
//---> 4
return res.json({
success: 1,
});
});
}
}
},
第一个错误 //---> 1
如果用户未登录,我想结束此上传过程并返回 success = 0。这是行不通的。在客户端,请求一直挂起,没有任何响应。
第二个错误 //---> 2
我之前遇到了这里描述的错误 https://github.com/balderdashy/skipper/issues/36因此,作为快速修复,我使用了有人在 github 的评论中使用的内容。但又和问题 1 一样,我遇到了这个问题。如果文件大小超过MAXBYTES,我想结束这个上传过程,返回success = 0给用户。不会返回到客户端。
第三个错误 //---> 3
我想使用 on progress 创建一个进度条。但我很快遇到了一些问题。首先,使用 on progress 会大大降低系统速度。它还会导致第 4 步出错。
第四个错误 //---> 4
如果我们从第 3 步中删除 on('progress'),这将按预期工作。完成上传后,它会向客户端返回 success = 1。但是,当 on('progress') 存在时,return res...
步骤 //---> 4
不起作用,客户端请求再次为一直挂着,没有任何反应。
几个问题:
为什么以下代码在 //---> 1
中不起作用,而在 //---> 4
中起作用,如果 on('progress') 不是礼物
return res.json({
success: 0
});
为什么 on progress 会拖慢上传速度?
顺便说一句,在我的客户端,我使用 form.js 插件。因此我的请求看起来像这样:
$('#upload').ajaxForm({
uploadProgress: function(event, position, total, percentComplete){
console.log(percentComplete);
},
success: function(data) {
console.log(data);
}
});
最佳答案
我花了一些时间来解决这个问题,而当我解决这个问题时,我已经完全忘记了我在 stackoverflow 上的问题。这些是我为完成这项工作所采取的一些步骤。
upload: function (req, res) {
if (_.isEmpty(req.session.User)){
return res.json({ // or destroy connection as shown below
success: 0
});
}else{
res.setTimeout(0);
var MAXBYTES = 10*1000*1000;
if (req._fileparser.form.bytesExpected && req._fileparser.form.bytesExpected > MAXBYTES) {
// file size exceeded //-> also check filesize on client-size before uploading because this will not send error report back to the client
req.connection.destroy();
}
req.file('file[]').on('progress', function(event){
// returning anything here was unnecessary
// For example jQuery form plugin's client-side `uploadProgress:` will still catch the progress
}).upload({
maxBytes: MAXBYTES
}, function whenDone(err, uploadedFiles) {
var tempFileNames = _.pluck(uploadedFiles, 'fd');
if (_.isEmpty(tempFileNames)) {
return res.json({
success: 0,
error: '0 files selected.'
});
}else{
// process upload
return res.json({
success: 1,
});
}
});
}
},
这仍然不是最好的解决方案。我实际上发现其中一些很老套。如果有人有更好的解决方案,请分享。
关于javascript - 在 sails.js 中使用船长处理上传(进行中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26206068/