2014-02-05 6 views
2

안녕하세요. node.js에서 클라이언트로 파일을 보내려고했습니다. 내 코드는 클라이언트가 지정된 URL (/helloworld/hello.js/test)로 이동하면 파일을 스트리밍합니다. Google 크롬에서 파일에 액세스하면 플레이어에서 파일 (.mp3)이 재생됩니다.Node.js가 클라이언트에 파일 보내기

제 목표는 클라이언트의 브라우저에서 파일을 다운로드하고 클라이언트에 저장할 위치를 물어보고 웹 사이트에 스트리밍하지 말라는 것입니다.

http.createServer(function (req, res) { 
     switch(req.url) { 
     case '/helloworld/hello.js/test': 
     var filePath = path.join(__dirname, '/files/output.mp3'); 
     var stat = fileSystem.statSync(filePath); 
     res.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.on('open', function() { 
    // This just pipes the read stream to the response object (which goes to the client) 
    readStream.pipe(res); 
    }); 

    readStream.on('error', function(err) { 
     res.end(err); 
}); 

답변

10

일부 헤더 플래그를 설정해야합니다.

res.writeHead(200, { 
    'Content-Type': 'audio/mpeg', 
    'Content-Length': stat.size, 
    'Content-Disposition': 'attachment; filename=your_file_name' 
}); 

다운로드로 스트리밍을 대체하려면;

var file = fs.readFile(filePath, 'binary'); 

res.setHeader('Content-Length', stat.size); 
res.setHeader('Content-Type', 'audio/mpeg'); 
res.setHeader('Content-Disposition', 'attachment; filename=your_file_name'); 
res.write(file, 'binary'); 
res.end(); 
+0

고마워요. 작동했지만 지금은 약 4MB의 파일 만 다운로드 할 수 있습니다. 전체 파일 크기는 약 6MB입니다. –

+0

파일 내용을 확인 했습니까? 모든 것이 안에 있습니까? –

+4

Node.js가 단일 스레드이기 때문에 요청 처리기에서'readFileSync' 사용자에게 매우 나쁜 것입니다. 따라서 해당 URL에 두 개의 요청이있는 경우 두 번째 요청은 첫 번째 작업이 완료 될 때까지 기다립니다. localhost에서는 아무 문제가 없다는 것을 알지 못하지만 초당 1,000 건의 요청이있는 프로덕션 서버에서는 지연이 발생합니다. ['readFile'] (http://nodejs.org/api/fs.html#fs_fs_readfile_filename_options_callback)을 대신 콜백으로 사용하십시오 – Curious

0
response.writeHead(200, { 
    'Content-Type': 'audio/mpeg', 
    modification-date="date_object", 
    'Content-Disposition: attachment; 
    filename=output.mp3' 

    }); 

당신은 단지 그 때 당신이 밖으로 데이터를 얻을 수 있습니다, 즉 콘텐츠 - 처리 부분 헤더 부분에 작품이 필요합니다. content Disposition

+0

@MaratArguinbaev - 이것으로 어떤 진전을 이룩하여 작동 시키셨습니까? 나는 그 오래된 끈을 알고 있지만 비슷한 것을하려고 노력하고있다. 다른 질문은 당신이 NODE.js를 고수했는지 아니면 결국 웹 소켓을위한 다른 프레임 워크/솔루션으로 옮겼습니까? 감사! – tamak

관련 문제