Лучший подход, если вы просто собираете «data» для «write ()» и «close» для «end ()»:
// 0.3.x style
fs.createReadStream(filename, {
'bufferSize': 4 * 1024
}).pipe(response)
// 0.2.x style
sys.pump(fs.createReadStream(filename, {
'bufferSize': 4 * 1024
}), response)
Подход read.pipe(write)
или sys.pump(read, write)
также имеет преимущество добавления управления потоком. Таким образом, если поток записи не может принимать данные так же быстро, он скажет потоку чтения отойти назад, чтобы минимизировать объем данных, буферизуемых в памяти.
flags:"r"
и mode:0666
подразумеваются тем фактом, что это FileReadStream
. Кодировка binary
устарела - если кодировка не указана, она будет работать только с буферами необработанных данных.
Кроме того, вы можете добавить некоторые другие вкусности, которые сделают ваш файл более привлекательным:
- Отнюдь для
req.headers.range
и посмотри, соответствует ли она строке типа /bytes=([0-9]+)-([0-9]+)/
. Если это так, вы хотите просто поток с этого начала до конца места. (Отсутствующее число означает 0 или «конец».)
- Хеш инода и время создания из вызова stat () в заголовок ETag. Если вы получили заголовок запроса с "if-none-match", совпадающим с этим заголовком, отправьте обратно
304 Not Modified
.
- Сравните заголовок
if-modified-since
с датой mtime
объекта статистики. 304, если он не был изменен с указанной даты.
Кроме того, как правило, если можете, отправьте заголовок Content-Length
. (Вы stat
-е файл, так что вы должны иметь это.)