89

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

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

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededstackoverflow.com/questions/20449055/node-js-stream-api-leak

    от
  • Error: User Rate Limit Exceededdon'tError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от andrei
  • Error: User Rate Limit Exceeded

    от andrei
  • 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/

  • 7

    Вам нужно использовать Stream для отправки файла (архива) в ответе

    более того, вы должны использовать соответствующий 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; указывает имя файла, который будет загружен.

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