[node.js] Nodejs는 응답으로 파일을 보냅니다.

Expressjs 프레임 워크에는 sendfile () 메서드가 있습니다. 전체 프레임 워크를 사용하지 않고 어떻게 할 수 있습니까? node-native-zip을 사용하여 아카이브를 만들고 사용자에게 보내려고합니다.



답변

다음은 디스크에서 스트리밍하여 myfile.mp3를 보내는 예제 프로그램입니다 (즉, 파일을 보내기 전에 전체 파일을 메모리로 읽지 않음). 서버는 포트 2000에서 수신합니다.

[업데이트] 코멘트에서 @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/ 에서 가져옴


답변

응답에서 파일 (아카이브)을 전송하려면 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");
      }
    });
  }
}

Content-Type 필드의 목적은 수신 사용자 에이전트가 적절한 에이전트 또는 메커니즘을 선택하여 사용자에게 데이터를 제공하거나 적절한 방식으로 데이터를 처리 할 수있을만큼 본문에 포함 된 데이터를 충분히 설명하는 것입니다.

“application / octet-stream”은 RFC 2046에서 “임의 이진 데이터”로 정의됩니다.이 콘텐츠 유형의 목적은 디스크에 저장하는 것입니다. 이것이 실제로 필요한 것입니다.

“filename = [파일 이름]”은 다운로드 할 파일 이름을 지정합니다.

자세한 내용은 이 stackoverflow 항목을 참조하십시오 .


답변