2017-06-06 1 views
0

Comment envoyer une partie du fichier en utilisant le flux de lecture en réponse à une requête HTTP?Envoyer une grande quantité de contenu en utilisant les flux

Je veux envoyer un Content-Range arbitraire d'un énorme fichier.

Je ne peux pas utiliser les événements lorsque je fais fs.createReadStream('hugeFile.bin').pipe(response) pour filtrer une partie du flux lisible. Je peux créer un faux flux inscriptible, qui omet (comme > /dev/null) une partie des données, mais la taille chunk peut ne pas être un multiple d'une première partie à envoyer.

Comment résoudre le problème?

Répondre

1

Jetez un coup d'œil à https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_createreadstream_path_options.

En particulier, les options start et end - permettent de définir les décalages d'octets dans le fichier pour démarrer et arrêter la lecture.

Donc, fondamentalement, vous feriez:

fs.createReadStream('hugeFile.bin', { start: firstByte, end: lastByte }).pipe(response) 

ou l'équivalent moral et ce serait faire ce que vous voulez.

+0

Si je fais 'response.statusCode = 216;' alors 'response.setHeader ('Content-Range', 'octets' + start + '-' + (fin - 1) + '/' + stat.size) ; ', alors que dois-je faire pour envoyer le contenu du fichier par flux? Devrais-je appeler 'response.end();' après la ligne de code que vous avez écrite? – Orient

+0

Ou devrais-je faire 'response.end();' dans le gestionnaire d'événements ''end'' de' fs.createReadStream (' hugeFile.bin ', {start: firstByte, end: lastByte}) 'objet? – Orient

+0

response.end sera appelée automatiquement lorsque le flux source se termine. Ça devrait juste marcher. –