Вопрос по node.js – Nodejs отправляет файл в ответ

89

В инфраструктуре Expressjs есть метод sendfile (). Как я могу сделать это без использования целого фреймворка. Я использую node-native-zip для создания архива, и я хочу отправить его пользователю.

Ваш Ответ

2   ответа
7

более того, вы должны использовать соответствующий Content-type в заголовке вашего ответа.

Есть пример функции, которая делает это:

const fs = require('fs');

// Where fileName is name of the file and response is Node.js Reponse. 
responseFile = (fileName, response) => {
  const filePath =  "/path/to/archive.rar" // or any file format

  // Check if file specified by the filePath exists 
  fs.exists(filePath, function(exists){
      if (exists) {     
        // Content-type is very interesting part that guarantee that
        // Web browser will handle response in an appropriate manner.
        response.writeHead(200, {
          "Content-Type": "application/octet-stream",
          "Content-Disposition": "attachment; filename=" + fileName
        });
        fs.createReadStream(filePath).pipe(response);
      } else {
        response.writeHead(400, {"Content-Type": "text/plain"});
        response.end("ERROR File does not exist");
      }
    });
  }
}

The purpose of the Content-Type field is to describe the data contained in the body fully enough that the receiving user agent can pick an appropriate agent or mechanism to present the data to the user, or otherwise deal with the data in an appropriate manner.

& Quot; приложения / октет-поток & Quot; определяется как «произвольные двоичные данные»; в RFC 2046 цель этого типа контента - сохранить его на диск - это то, что вам действительно нужно.

& quot; имя_файла = [имя файла] & quot; указывает имя файла, который будет загружен.

Для получения дополнительной информации см.эта тема.

Error: User Rate Limit Exceeded
140

которая отправит файл myfile.mp3 путем его потоковой передачи с диска (то есть он не считывает весь файл в память перед отправкой файла). Сервер прослушивает порт 2000.

[Update] Как упомянуто @Aftershock в комментариях,util.pump ушел и был заменен методом в прототипе Stream под названиемpipe; код ниже отражает это.

var http = require('http'),
    fileSystem = require('fs'),
    path = require('path');

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
    });

    var readStream = fileSystem.createReadStream(filePath);
    // We replaced all the event handlers with a simple call to readStream.pipe()
    readStream.pipe(response);
})
.listen(2000);

Взято изhttp://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/

Error: User Rate Limit Exceededdon'tError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded andrei
Error: User Rate Limit Exceededstackoverflow.com/questions/20449055/node-js-stream-api-leak
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded andrei

Похожие вопросы