2016-11-02 3 views
1

Wenn ich die Box REST API abfragen und einen lesbaren Stream abrufen, was ist der beste Weg, damit umzugehen? Wie sendest du es an den Browser? (DISCLAIMER: Ich bin neu in Streams und Puffer, so dass einige dieser Code ist ziemlich theoretisch)Nodejs: So senden Sie einen lesbaren Stream an den Browser

Können Sie den ReadStream in der Antwort übergeben und lassen Sie den Browser damit umgehen? Oder müssen Sie die Chunks in einen Puffer streamen und dann den Puffer senden?

export function getFileStream(req, res) { 
    const fileId = req.params.fileId; 
    console.log('fileId', fileId); 
    req.sdk.files.getReadStream(fileId, null, (err, stream) => { 
    if (err) { 
     console.log('error', err); 
     return res.status(500).send(err); 
    } 
    res.type('application/octet-stream'); 
    console.log('stream', stream); 
    return res.status(200).send(stream); 
    }); 
} 

Wird ^^ Arbeit, oder tun Sie etwas tun müssen:

export function downloadFile(req, res) { 
    const fileId = req.params.fileId; 
    console.log('fileId', fileId); 
    req.sdk.files.getReadStream(fileId, null, (err, stream) => { 
    if (err) { 
     console.log('error', err); 
     return res.status(500).send(err); 
    } 
    const buffers = []; 
    const document = new Buffer(); 
    console.log('stream', stream); 
    stream.on('data', (chunk) => { 
     buffers.push(buffer); 
    }) 
    .on('end', function(){ 
     const finalBuffer = Buffer.concat(buffers); 
     return res.status(200).send(finalBuffer); 
    }); 
    }); 
} 

Antwort

1

Das erste Beispiel funktionieren würde, wenn man Sie theoretische Linie geändert:

- return res.status(200).send(stream); 
+ res.writeHead(200, {header: here}) 
+ stream.pipe(res); 

Das ist das ist netteste Sache über Knotenstrom. Der andere Fall würde (im Wesentlichen) auch funktionieren, aber es würde viel unnötige Speicher ansammeln.

Wenn Sie ein funktionierendes Beispiel überprüfen mögen, dann ist hier, den ich auf Scramjet basierend schrieb, Express- und browserify:

https://github.com/MichalCz/scramjet/blob/master/samples/browser/browser.js

Wo Ihr Streams vom Server an den Browser gehen. Mit kleinen Mods passt es zu deinem Problem.

Verwandte Themen