10

我无法弄清楚如何将 flow.js 库与节点后端一起使用,并将我的代码基于flow.js github 上的示例。

我正在获取 blob 文件,但在上传完成后我没有构建二进制文件。最终获取没有被触发或我的路线错误:

  app.get('/download/:identifier', function(req, res){
    console.log('we writin')
    flow.write(req.params.identifier, res);
  });

任何有这方面经验的人都可能得到一百万个 stackoverflow pts,因为这似乎是使用 node.js 和 flow.js 时的常见问题,这里还有另外两个未回答的问题:

Flowjs 文件上传 - AngularJS 和节点 重组文件块在多部分上传中产生

4

3 回答 3

8

我找到了一种可行的方法,但可能不是理想的方法。

flow.write在这里,我正在调用flow.postif statusis doneand currentTestChunk > numberOfChunks。我会进行大于检查,因为有时会flow.post发送status done不止一次,如此所述。

编辑:我添加了一种在创建文件后清理块的方法。

flow.post(req, function(status, filename, original_filename, identifier, currentTestChunk, numberOfChunks) {
        console.log('POST', status, original_filename, identifier);
        res.send(200);
        if (status === 'done' && currentTestChunk > numberOfChunks) {
            var stream = fs.createWriteStream('./tmp/' + filename);
            //EDIT: I removed options {end: true} because it isn't needed
            //and added {onDone: flow.clean} to remove the chunks after writing
            //the file.
            flow.write(identifier, stream, { onDone: flow.clean });            
        }            
    })

我不得不修改flow.post's 的回调来发送currentTestChunknumberOfChunks.

文件:flow-node.js

$.post = function(req, callback){

//There's some codez here that we can overlook...

  fs.rename(files[$.fileParameterName].path, chunkFilename, function(){

    // 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) {

                //Add currentTestChunk and numberOfChunks to the callback

                callback('done', filename, original_filename, identifier, currentTestChunk, numberOfChunks);
              } else {
                // Recursion
                testChunkExists();
              }
            } else {

              //Add currentTestChunk and numberOfChunks to the callback

              callback('partly_done', filename, original_filename, identifier, currentTestChunk, numberOfChunks);
            }
          });
        }
    testChunkExists();
  });
} else {
      callback(validation, filename, original_filename, identifier);
}

}

如果要删除块,请在 flow.write 中使用 onDone 调用 flow.clean。

  $.write = function(identifier, writableStream, options) {
      options = options || {};
      options.end = (typeof options['end'] == 'undefined' ? true : options['end']);

      // Iterate over each chunk
      var pipeChunk = function(number) {

          var chunkFilename = getChunkFilename(number, identifier);
          fs.exists(chunkFilename, function(exists) {

              if (exists) {
                  // If the chunk with the current number exists,
                  // then create a ReadStream from the file
                  // and pipe it to the specified writableStream.
                  var sourceStream = fs.createReadStream(chunkFilename);
                  sourceStream.pipe(writableStream, {
                      end: false
                  });
                  sourceStream.on('end', function() {
                      // When the chunk is fully streamed,
                      // jump to the next one
                      pipeChunk(number + 1);
                  });
              } else {
                  // When all the chunks have been piped, end the stream
                  if (options.end) {
                          writableStream.end();
                      }

                  //Options.onDone contains flow.clean so here I'm deleting all the chunked files.

                  if (options.onDone) {
                      options.onDone(identifier);
                  }
              }
          });
      }
      pipeChunk(1);
  }
于 2014-07-25T05:49:05.037 回答
3

好的,所以我一直在研究这个并想出了这个,希望它能让有人开始......

exports.post = function (req, res, next) {

    flow.post(req, function(status, filename, original_filename, identifier) {

        console.log('status: '+ status, filename, original_filename, identifier);

        if(status==='done'){

            var s = fs.createWriteStream('./uploads/' + filename);
            s.on('finish', function() {

                res.send(200, {
                    // NOTE: Uncomment this funciton to enable cross-domain request.
                    //'Access-Control-Allow-Origin': '*'
                });

            });

            flow.write(identifier, s, {end: true});
        }

    });

};
于 2014-07-21T19:09:10.453 回答
0

我已经发出了一个拉取请求,它将重新组装逻辑添加到 Flow.js 的 Node 示例中。请参阅https://github.com/flowjs/flow.js/pull/71https://github.com/flowjs/flow.js/issues/17

于 2015-01-23T14:09:27.863 回答