【问题标题】:Force download through js or query通过js或查询强制下载
【发布时间】:2011-07-08 18:04:45
【问题描述】:

是否可以通过 JS 或 Javascript 强制下载,即网页不应在浏览器的新选项卡中打开文件,而是弹出让用户选择“另存为”或使用 ???

【问题讨论】:

标签: javascript jquery


【解决方案1】:

不,这是不可能的,感谢上帝,这不可能。否则,当您在不知情的情况下访问网站时,您的计算机上可能会存储哪些类型的文件。

正如@Paul D. White 在 cmets 部分中指出的那样,如果要使用与其关联的默认程序内联(在浏览器中)打开文件,则可以让服务器发送 Content-Disposition HTTP 标头。例如:

Content-Disposition: inline; filename=foo.pdf

【讨论】:

  • 正确:您只能在服务器端执行此操作,因为它是通过设置 HTTP 响应标头(特别是 content-disposition: attachment)来完成的。一旦页面在客户端中打开,根据定义,HTTP 响应已经被处理。
  • 提问者明确表示他想在对话框中使用它而不是打开新标签,所以这不是您要回复的内容?
  • @gnur,正确的。我将更新我的答案以包括@Paul D. White 出色的提议。
  • 目前我在页面上有一个按钮来下载 pdf ..... 它的作用是调用一个 ajax 函数,该函数使用后端 PHP 文件将 PDF 存储在磁盘上。然后我想只需在 ajax 成功方法中强制下载该 PDF .....
  • @user418232,恐怕这是不可能的。您不能使用 javascript 写入客户端计算机。
【解决方案2】:

不,仅使用 JQuery/JavaScript 是不可能的。

您将需要一个服务器端脚本,它会返回带有Content-Type(HTTP 标头)的文件,这将强制浏览器下载您请求的文件。 Content-Type 的可能值是 application/force-download

【讨论】:

  • 但即使是这样的标头也不会强制下载,这取决于用户如何在其浏览器上本地设置选项。
【解决方案3】:

您不能从 JavaScript 强制执行该行为,需要在服务器端设置 HTTP 标头:

Content-disposition=attachment; filename=some.file.name

解决问题的方法是让你的 AJAX 方法将用户重定向到 PDF 的 URL:

location.replace('path/to.pdf');

(PDF必须设置上述HTTP头)


更新

在给出这个答案的时候,这是不可能的。现在是,向下滚动查看the other answer saying so

【讨论】:

  • 现在可以使用download 属性。
  • @mpen 是的,有一个答案是这样说的。在提出问题时,它不可用
  • 是的。并不是说您需要更改答案,但它出现在顶部并且已被接受,所以我只是让人们知道懒得进一步滚动:-)
  • @mpen 从 Chrome 65 开始,跨域 href 不再可能。因此,如果您想在 imgur.com 以外的域上创建 <a href="https://i.imgur.com/IskAzqA.jpg" download>,它将无法按预期工作。此处的弃用和删除公告:developers.google.com/web/updates/2018/02/…
  • 不,标题或任何其他方法都不会强制下载。这个答案不正确。
【解决方案4】:

随着 HTML5 的出现,您可以在锚标记中使用新的属性下载。

代码看起来像

<a download="name_of_downloaded_file" href="path/to/the/download/file"> Clicking on this link will force download the file</a>

它适用于 firefox 和 chrome 最新版本。我应该提到我没有在 IE 中检查它吗? :P

在 sstur 评论后编辑下载属性


https://caniuse.com/#feat=download

【讨论】:

  • 值得注意的是,您可以为下载属性指定一个值,该值将成为下载的默认文件名。
  • 这确实是更先进的解决方案,但截至 2013 年 11 月,在 IE 或大多数移动设备上不支持。 (来源:caniuse.com/#feat=download
  • 它不适用于 Opera 或 IE,但是我自己仍然喜欢这个解决方案。
  • 作为security feature,当内容位于不同主机名且来源受X-Frame-Options: SAMEORIGIN 等标头限制时,您指定的下载值将被忽略。
  • 好吧,浏览器会阻止您在不同站点或不同端口下启用文件下载,因此功能非常有限......
【解决方案5】:

动态创建链接并点击下载属性强制下载为文件:

var anchor = document.createElement('a');
anchor.href = this.props.download_url;
anchor.target = '_blank';
anchor.download = this.props.file_name;
anchor.click();

请注意,我什至没有将它添加到 DOM,所以它很快。

P.S download 属性不适用于 IE。但它只会在新标签中打开链接。 http://caniuse.com/#feat=download

【讨论】:

  • 而且 click() 也不适用于许多浏览器,或者仅适用于按钮:developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click
  • 什么浏览器?旧的默认安卓?我从来没有收到过关于这不起作用的票,而且这个答案已经有好几年了。做一个测试,显示什么不起作用。
  • 我无法使用 Edge 和 IE 进行测试,但 Firefox 的最新版本与 click() 不兼容,仅适用于按钮。检查我之前设置的 MDN 链接,在底部,Gecko 的特别说明,它在 safari 6 和 chrome 20 下是一样的(当然,旧浏览器)
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 2021-10-09
  • 2013-01-24
  • 2020-12-13
  • 2019-06-07
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多