2014-02-05 116 views
2

你好,我一直在试图从node.js发送文件到客户端。我的代码工作,但是当客户端去指定的网址(/helloworld/hello.js/test)它流文件。从谷歌浏览器访问它使文件(.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有两个请求,那么第二个请求会等到第一个请求完成它的操作。在本地主机上,您可能没有注意到任何问题,但是在每秒有1000个请求的生产服务器上,会有延迟。使用['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还是最终转向另一个框架/解决方案来实现websockets?谢谢! – tamak

相关问题