如何让firefox完成restify发送的下载? (的NodeJS)

时间:2016-01-08 19:47:29

标签: javascript node.js firefox restify

我有一个HTTP端点,它在响应请求时传递文件。我的意图是由浏览器下载,因此我将Content-Type设置为application/octet-streamContent-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;行为。

1 个答案:

答案 0 :(得分:0)

尝试快速助手功能:

res.download(filename);

或使用 fs 读取流:

  res.setHeader('Content-disposition', 'attachment; filename=' + filename);

  var filestream = fs.createReadStream(file);
  filestream.pipe(res);