Ho trovato un metodo che funziona ma potrebbe non essere l'approccio ideale.
Qui sto chiamando flow.write
in flow.post
se status
è done
e currentTestChunk > numberOfChunks
. Faccio il maggiore di controllo perché a volte flow.post
invia status done
più di una volta come indicato here.
Modifica: Ho aggiunto un metodo per pulire i blocchi dopo aver creato il file.
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 });
}
})
ho dovuto modificare richiamata s' flow.post
per inviare currentTestChunk
e numberOfChunks
.
File: portate 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);
}
}
nei call flow.clean flow.write con onDone se si desidera rimuovere i pezzi.
$.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);
}
Fantastico! Qualche possibilità di inviare un PR al flusso. ecco un link: https://github.com/flowjs/flow.js/issues/17#issuecomment-49737531 – flashpunk
Ehi @flashpunk, lo esaminerò quando ne avrò l'occasione. – cleversprocket
Non vedo come ripetere il controllo, "if (currentTestChunk> numberOfChunks)", nel callback subito dopo il primo controllo può aiutare a risolvere il problema dello stato di fatto che viene attivato più di una volta. –