1

我正在尝试将skipper和 flowjs 与 ng-flow 一起用于大文件上传。

基于flowjs 存储库中的 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 参数都会出现这些错误。

我知道必须首先发送文本参数才能与船长正确工作。在 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 错误。

4

0 回答 0