Javascript 如何让firefox完成从restify发送的下载?(nodejs)
我有一个HTTP端点,它在响应请求时传递一个文件。我的目的是通过浏览器下载,因此我将Javascript 如何让firefox完成从restify发送的下载?(nodejs),javascript,node.js,firefox,restify,Javascript,Node.js,Firefox,Restify,我有一个HTTP端点,它在响应请求时传递一个文件。我的目的是通过浏览器下载,因此我将内容类型设置为application/octet-stream,内容配置设置为附件;Filename=“my_Filename.txt”以确保文件进入下载,而不是在当前窗口中打开 然而,我看到的效果是下载部分完成了——Firefox创建了一个文件,其扩展名与内容类型相适应,但下载从未完成。如果我打开这个文件,我会看到它确实充满了我的数据,但firefox似乎从来没有“完成”下载,并重命名临时文件以匹配我的内容配置
内容类型设置为application/octet-stream
,内容配置设置为附件;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
触发,从而导致所述行为。如果我只是简单地将url粘贴到地址栏中,下载看起来是可行的,但是如果我从javascript或单击链接启动它,就会出现这种奇怪的“挂起”行为。试试Express helper函数:
res.download(filename);
或使用fs读取流:
res.setHeader('Content-disposition', 'attachment; filename=' + filename);
var filestream = fs.createReadStream(file);
filestream.pipe(res);
实际上是在使用restify——很抱歉在标题中加入了express。(已编辑)在所有平台上,使用读取流在firefox中都会导致相同的挂起行为。请尝试在filestream之后执行res.end()。恐怕res.pipe(res)res.end()也不能缓解这种情况。这一定很愚蠢,但我真的很烦恼。我希望你能告诉我们什么是真正有效的。我也有同样的问题。