我使用优秀的flow.js库来处理文件上传。它是一个可恢复的HTML5上传,它在服务器上产生一堆必须重新组装的块。例如,foo.mov可能会变成
timestamp-foomov.1
timestamp-foomov.2
...
timestamp-foomov.n
上传工作正常,但我无法将这些部分重新组合成单个二进制文件。我从Github(https://github.com/flowjs/flow.js/tree/master/samples/Node.js)上提供的库作者的Node.js服务器示例中获得了以下代码。
$.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();
if (options.onDone) options.onDone();
}
});
}
pipeChunk(1);
}
我使用以下路由调用此代码,并期望它在tmp目录中生成重新组合的二进制文件(我在那里保存我的块)。然而,什么也没发生。我错过了什么?
exports.download = function(req, res, next) {
switch(req.method) {
case 'GET':
var stream = fs.createWriteStream('foobar');
flow.write(req.params.identifier, res);
break;
}
}
答案 0 :(得分:1)
重新组装所有块很容易,只需这样称呼:
var stream = fs.createWriteStream(filename);
r.write(identifier, stream);
就是这样!
但其他问题是,应该调用此方法吗? 也许当所有的块都被上传并出现在tmp文件夹中时。
但是完成的重复调用存在另一个问题。 一旦存在所有块,就可以通过创建和锁定文件来解决这个问题。 然后拨打
r.write(identifier, stream);
然后清除所有块,释放锁并关闭文件。
在php服务器端库中完成相同的approuch:https://github.com/flowjs/flow-php-server/blob/master/src/Flow/File.php#L102