nodejs - fs.createReadStream (). pipe, как узнать размер файла - PullRequest
4 голосов
/ 20 декабря 2011

Я пишу свой собственный модуль HTTP, если мне нужно ответить с помощью двоичного файла, например, .jpg,

Я загружаю файл, используя: body = fs.createReadStream(pathOfFile).

Когда я генерирую ответ, я использую: body.pipe(socket);

Но в качестве ответа HTTP я хотел добавить заголовок Content-Length.

Я не мог найти простой способ сделать это, fs.stat не дает результат сразу, но сразу после того, как я вызвал pipe.

В любом случае, чтобы знать, что отправлять в заголовке Content-Length.

Спасибо.

Ответы [ 2 ]

16 голосов
/ 20 декабря 2011

Ну, вы должны отправить ответ и передать файл только после того, как получите размер с помощью fs.stat, например:

fs.stat(file_path, function(error, stat) {
  if (error) { throw error; }
  response.writeHead(200, {
    'Content-Type' : 'image/gif',
    'Content-Length' : stat.size
  });
  // do your piping here
}); 
3 голосов
/ 07 августа 2013

Существует также синхронная версия (поскольку вы все равно будете блокировать файловый ввод-вывод ...), как упоминалось в этом другом посте

var stat = fs.statSync(pathOfFile);
response.writeHead(200, {
    'Content-Type' : 'image/jpeg',
    'Content-Length' : stat.size
});
// pipe contents
...