Tôi đã tìm thấy một phương pháp hoạt động nhưng có thể không phải là phương pháp lý tưởng.
Ở đây tôi đang gọi flow.write
trong flow.post
nếu status
là done
và currentTestChunk > numberOfChunks
. Tôi làm lớn hơn séc vì đôi khi flow.post
gửi status done
nhiều lần như đã đề cập here.
Chỉnh sửa: Tôi đã thêm một cách để xóa các khối sau khi tạo tệp.
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 });
}
})
tôi đã phải sửa đổi callback flow.post
's để gửi currentTestChunk
và numberOfChunks
.
File: dòng chảy 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);
}
}
Trong flow.clean gọi flow.write với onDone nếu bạn muốn loại bỏ các khối.
$.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);
}
Tuyệt vời! Bất kỳ cơ hội nào bạn có thể gửi PR cho luồng.Js github repo? đây là một liên kết: https://github.com/flowjs/flow.js/issues/17#issuecomment-49737531 – flashpunk
Hey @flashpunk, tôi sẽ xem xét điều đó khi tôi có cơ hội. – cleversprocket
Tôi không thấy làm thế nào lặp lại kiểm tra, "nếu (currentTestChunk> numberOfChunks)", trong cuộc gọi lại ngay sau khi kiểm tra đầu tiên có thể giúp khắc phục vấn đề của tình trạng thực hiện được kích hoạt nhiều lần. –