Объект ответа HTTP в узле (response
в приведенном выше коде) является записываемым потоком.Это означает, что если у нас есть читаемый поток, представляющий содержимое myfile.mp3
, вы можете просто передать содержимое файла в объект ответа.Это будет выглядеть примерно так:
readStream.pipe(response)
Это предотвращает загрузку файла (т. Е. myfile.mp3
) полностью в память перед отправкой в качестве ответа, и является рекомендуемым способомсделать это, чтобы предотвратить высокое давление памяти на стороне сервера.
Есть ли возможность отправлять файлы без использования pipe()
?
На самом деле есть методчто позволяет отправлять файлы без использования pipe()
, но этот подход не рекомендуется, поскольку он сначала загружает весь файл в память, а затем записывает файл в объект ответа.В любом случае, вот пример того, как это сделать:
http.createServer(function(request, response) {
var filePath = path.join(__dirname, 'myfile.mp3');
var stat = fileSystem.statSync(filePath);
response.writeHead(200, {
'Content-Type': 'audio/mpeg',
'Content-Length': stat.size
});
fs.readFile(filePath, (err, data) => {
if (err) throw err;
response.end(data);
});
}).listen(2000);