Javascript 如何让firefox完成从restify发送的下载?(nodejs)

Javascript 如何让firefox完成从restify发送的下载?(nodejs),javascript,node.js,firefox,restify,Javascript,Node.js,Firefox,Restify,我有一个HTTP端点,它在响应请求时传递一个文件。我的目的是通过浏览器下载,因此我将内容类型设置为application/octet-stream,内容配置设置为附件;Filename=“my_Filename.txt”以确保文件进入下载,而不是在当前窗口中打开 然而,我看到的效果是下载部分完成了——Firefox创建了一个文件,其扩展名与内容类型相适应,但下载从未完成。如果我打开这个文件,我会看到它确实充满了我的数据,但firefox似乎从来没有“完成”下载,并重命名临时文件以匹配我的内容配置

我有一个HTTP端点,它在响应请求时传递一个文件。我的目的是通过浏览器下载,因此我将
内容类型设置为
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()也不能缓解这种情况。这一定很愚蠢,但我真的很烦恼。我希望你能告诉我们什么是真正有效的。我也有同样的问题。