【问题标题】:node/express Force browser to download file with custom namenode/express 强制浏览器下载自定义名称的文件
【发布时间】:2016-08-24 12:18:13
【问题描述】:

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

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

所以我发现了标签“a”的 HTML5 属性“下载”。它只是解决了我的问题,但不是每个版本的 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 配置文件,用于设置文件所在的主机、端口和起始路径。

提前致谢:)

【问题讨论】:

    标签: javascript node.js express download proxy


    【解决方案1】:

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

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

    如果您希望浏览器尝试自行打开其中的文件,也可以使用“内联”,就像 Chrome 对 pdf 文件所做的那样。

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

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

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

    【讨论】:

    • 要强制下载,您可能还需要将Content-Type: application/octet-stream 添加到Content-Disposition: attachment
    【解决方案2】:

    在 Express 4 及更高版本中,有 2 个帮助函数来更改内容类型并指定附件处置:

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

    请参阅 typeattachment 的文档。

    【讨论】:

      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 2018-05-15
      • 2015-04-16
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      相关资源
      最近更新 更多