2014-05-03 17 views
10

Ich kann nicht herausfinden, wie die flow.js-Bibliothek mit einem Knoten-Backend zu verwenden und meinen Code von der Probe auf der flow.js Github basiert.reassemble binary nach flow.js upload auf node/express server

Ich erhalte die Blob-Dateien, aber ich baue die Binärdatei nicht, nachdem der Upload abgeschlossen ist. Die endgültige get wird nicht immer ausgelöst oder mein Weg ist falsch:

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

jedermann haben keine Erfahrung mit diesem wie eine Million Stackoverflow-Punkte bekommen könnte, weil dies ein weit verbreitetes Problem zu sein scheint, wenn node.js und Fluss mit. js und hier sind zwei weitere offene Fragen:

Flowjs file upload - AngularJS and Node Reassembling file chunks produced in a multi-part upload

Antwort

8

Ich habe eine Methode gefunden, die funktioniert, aber möglicherweise nicht der ideale Ansatz ist.

Hier Ich rufe flow.write in flow.post wenn statusdone und currentTestChunk > numberOfChunks ist. Ich mache das größer als überprüfen, weil manchmal flow.post sendet status done mehr als einmal wie erwähnt here.

Bearbeiten: Ich habe einen Weg hinzugefügt, um die Chunks nach dem Erstellen der Datei zu reinigen.

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 });    
     }    
    }) 

Ich hatte flow.post ‚s Rückruf senden currentTestChunk und numberOfChunks zu ändern.

Datei: Fluss 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); 
} 

}

In flow.write Anruf flow.clean mit ondone, wenn Sie die Stücke entfernen möchten.

+0

Super! Gibt es eine Chance, dass Sie einen PR zum flow.Js github repo einreichen können? Hier ist ein Link: https://github.com/flowjs/flow.js/issues/17#issuecomment-49737531 – flashpunk

+0

Hey @flashpunk, ich werde das untersuchen, wenn ich eine Chance bekomme. – cleversprocket

+0

Ich sehe nicht, wie die Überprüfung "If (currentTestChunk> numberOfChunks)" im Callback unmittelbar nach der ersten Überprüfung dazu beitragen kann, das Problem des Done-Status mehr als einmal zu lösen. –

3

Ok, also habe ich auf diese gearbeitet und haben damit kommen, hoffentlich wird es jemanden gestartet ...

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}); 
     } 

    }); 

};