使用Flowjs上传Sailsjs Skipper文件

时间:2016-02-05 15:26:54

标签: sails.js skipper flow-js ng-flow

我正在尝试将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。

0 个答案:

没有答案