我有一个HTTP端点,它在响应请求时传递文件。我的意图是由浏览器下载,因此我将Content-Type
设置为application/octet-stream
,Content-Disposition
设置为Attachment; Filename="my_filename.txt"
以确保文件转到下载而不是在当前窗口中打开。
然而,我看到的效果是下载部分完成 - Firefox创建了一个文件,其扩展名适合内容类型,但下载永远不会完成。如果我打开文件,我发现它确实充满了我的数据,但firefox似乎永远不会完成"下载,并重命名临时文件以匹配我的内容处置。这是服务器上的代码:
db.Job.getFileForJobId(req.params.id, function(err, file) {
if(err) {
log.error(err);
res.json({
status:"fail",
data:{file:err}
});
} else {
fs.readFile(file.path, function(err, data) {
if(err) {
log.error(err);
res.json({
status:"fail",
data:{file:err}
});
}
res.writeHead(200, {
'Content-Type': 'application/octet-stream',
'Content-Disposition': 'Attachment; filename="' + file.filename + '"'
});
res.write(data);
res.end();
});
}
});
通过单击链接或通过在javascript中设置document.location
来触发此下载,这会导致所描述的行为。如果我只是将网址粘贴到地址栏中,下载似乎可以正常工作,但如果我是通过javascript或点击链接启动它,我会觉得这很奇怪而且#34;挂起了#34;行为。
答案 0 :(得分:0)
尝试快速助手功能:
res.download(filename);
或使用 fs 读取流:
res.setHeader('Content-disposition', 'attachment; filename=' + filename);
var filestream = fs.createReadStream(file);
filestream.pipe(res);