node / express强制浏览器下载带有自定义名称的文件

时间:2016-04-29 11:01:55

标签: javascript node.js express download proxy

我为我的大学项目建立了一个节点/快递网站,在搜索了法律ID之后,它显示了一个包含不同格式和与此ID相关的语言的所有文件的大表。 我使用模块" http-proxy"请求并将这些文件提供给客户端。 提供xml,xhtml,html和pdf文件时没有错(每个浏览器都能直接查看它们)。 我有.zip和.rdf文件的问题。文件没有损坏,但它们正在丢失原始名称

  • 当我点击ZIP图标时,它会给我下载提示,但是我丢失了原始文件名(该文件将被称为"代理"或" proxy.zip& #34;,不同浏览器上的不同行为)
  • 当我点击RDF图标时,有些浏览器会直接在浏览器中打开文件,有些浏览器无法识别格式,有些浏览器想要下载名称" proxy")

所以我发现了HTML5属性"下载"标签" a"。它只是解决了我的问题,无论如何它在每个版本的Internet Explorer和Safari上都不受支持。浏览网页我找到了一些解决方法来添加"右键单击并保存为..."在IE或Safari中查看页面之后的div链接,但这个解决方案不适合我,因为我不是在谈论单个链接而是一个充满链接的表。我的网站也需要在手机上工作。

有没有办法编写一些服务器端代码来强制浏览器下载带有自定义文件名的文件?

以下是代理的一小段代码:

var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({ ignorePath: true });

app.get('/proxy', function(req , res) {
    var file = req.query.file;
    var realurl = 'http://'+cfg.edb_opt.host+':'+cfg.edb_opt.port+cfg.edb_opt.rest+file;
    console.log('Proxy: serving '+realurl);
    proxy.web(req, res, { 'target': realurl });
});

所有cfg *变量都来自json配置文件,用于设置包含文件的主机,端口和起始路径。

提前致谢:)

2 个答案:

答案 0 :(得分:7)

您需要向响应对象添加新标头以指示文件名并进行常规下载。

res.set("Content-Disposition", "attachment;filename=somefile.ext");

你也可以使用" inline"如果您希望浏览器尝试在其中自行打开文件,就像Chrome使用pdf文件一样。

res.set("Content-Disposition", "inline;filename=somefile.ext");

根据@Thomas建议,总是包含正确的内容类型也是一个好主意:

res.set("Content-Type", "application/octet-stream");

答案 1 :(得分:0)

在Express 4和更高版本中,有2个帮助器函数可以更改内容类型并指定附件的处理方式:

res.type("application/octet-stream");
res.attachment("filename.ext");

请参阅typeattachment的文档。