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 항목을 참조하십시오 .