节点/expression强制浏览器下载具有自定义名称的文件

我为我的大学项目build立了一个节点/快递网站,在search到一个法律ID后,它会显示一个大表格,其中包含与此ID相关的所有文件格式和语言。 我使用模块“ http-proxy ”向客户端请求并提供这些文件。 当提供XML,XHTML,HTML和PDF文件(每个浏览器都能够直接查看它们)时没有任何错误。 我有.zip和.rdf文件的问题。 文件没有损坏,但他们失去了原来的名字

  • 当我点击ZIP图标,它给我的下载提示,但我失去了原来的文件名(该文件将被称为“代理”或“proxy.zip”,在不同的浏览器上的不同行为)
  • 当我点击RDF图标时,一些浏览器直接在浏览器中打开文件,一些浏览器不会识别格式,一些浏览器想用名称“proxy”来下载它)

所以我发现标签“a”的HTML5属性“下载”。 它只是解决了我的问题,无论如何它不支持每个版本的Internet Explorer和Safari。 浏览网页时,我发现一些解决方法,当在IE或Safari浏览器中查看页面时,在div链接之后添加“右键单击并另存为…”,但此解决scheme不适用于我,因为我不是在谈论单个链接,但一个表格链接。 而我的网站也需要在手机上工作。

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

这是代理的一小段代码:

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 *variables都来自jsonconfiguration文件,以设置包含文件的主机,端口和起始path。

提前致谢 :)

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

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

您也可以使用“内联”,而不是让浏览器尝试在自己的内部打开文件,就像使用Chrome浏览器的PDF文件一样。

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

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

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