我正在尝试将skipper和flowjs与ng-flow一起用于大文件上传。
基于位于flowjs存储库中的sample for Nodejs,我创建了我的sails控制器和服务来处理文件上传。当我上传一个小文件时,它工作正常,但如果我尝试上传更大的文件(例如200 Mb的视频),我收到错误(如下所列),数组req.file('file')._files
为空。在上传期间仅发生几次的交叉事实。例如,如果flowjs将文件剪切为150个块,则在sails控制台中,这些错误将仅出现3-5次。因此,几乎所有的块都会上传到服务器,但有一些丢失,结果文件已损坏。
verbose: Unable to expose body parameter `flowChunkNumber` in streaming upload! Client tried to send a text parameter (flowChunkNumber) after one or more files had already been sent. Make sure you always send text params first, then your files.
所有flowjs参数都会出现这些错误。
我知道必须首先发送文本参数才能正确使用skipper。在chrome网络控制台中,我检查过flowjs以正确的顺序发送这些数据。
有什么建议吗?
upload: function (req, res) {
flow.post(req, function (status, filename, original_filename, identifier) {
sails.log.debug('Flow: POST', status, original_filename, identifier);
res.status(status).send();
});
}
$.post = function(req, callback) {
var fields = req.body;
var file = req.file($.fileParameterName);
if (!file || !file._files.length) {
console.log('no file', req);
file.upload(function() {});
}
var stream = file._files[0].stream;
var chunkNumber = fields.flowChunkNumber;
var chunkSize = fields.flowChunkSize;
var totalSize = fields.flowTotalSize;
var identifier = cleanIdentifier(fields.flowIdentifier);
var filename = fields.flowFilename;
if (file._files.length === 0 || !stream.byteCount)
{
callback('invalid_flow_request', null, null, null);
return;
}
var original_filename = stream.filename;
var validation = validateRequest(chunkNumber, chunkSize, totalSize, identifier, filename, stream.byteCount);
if (validation == 'valid')
{
var chunkFilename = getChunkFilename(chunkNumber, identifier);
// Save the chunk by skipper file upload api
file.upload({saveAs:chunkFilename},function(err, uploadedFiles){
// Do we have all the chunks?
var currentTestChunk = 1;
var numberOfChunks = Math.max(Math.floor(totalSize / (chunkSize * 1.0)), 1);
var testChunkExists = function()
{
fs.exists(getChunkFilename(currentTestChunk, identifier), function(exists)
{
if (exists)
{
currentTestChunk++;
if (currentTestChunk > numberOfChunks)
{
callback('done', filename, original_filename, identifier);
} else {
// Recursion
testChunkExists();
}
} else {
callback('partly_done', filename, original_filename, identifier);
}
});
};
testChunkExists();
});
} else {
callback(validation, filename, original_filename, identifier);
}};
找到设置flowjs属性maxChunkRetries: 5
的解决方案,因为默认情况下它是0
。
在服务器端,如果req.file('file')._files
为空,则我不会抛出永久性(在flowjs的上下文中)错误。
所以,它解决了我的问题,但质疑为什么它的行为仍然是开放的。 flowjs和Nodejs的示例代码使用connect-multiparty
并且没有任何其他错误处理代码,所以它很可能是skipper bodyparser bug。