你好,我一直在尝试从node.js向客户端发送文件。我的代码可以工作,但是当客户端转到指定的URL(/helloworld/hello.js/test)时,它会传输文件。从谷歌浏览器访问它使文件(.mp3)在播放器中播放。
我的目标是让客户端的浏览器下载文件并询问客户端他想要存储它的位置,而不是在网站上传输它。
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);
});
答案 0 :(得分:13)
您需要设置一些标题标记;
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();
答案 1 :(得分:2)
以下解决方案适用于Express JS。
app.get('/download', (req, res) => res.download('./file.pdf'))
答案 2 :(得分:0)
response.writeHead(200, {
'Content-Type': 'audio/mpeg',
modification-date="date_object",
'Content-Disposition: attachment;
filename=output.mp3'
});
你需要在你的标题部分工作,即你的内容 - 处置部分,只有这样你才能获得数据。详细了解content Disposition