Chrome 下载属性不起作用

Posted

技术标签:

【中文标题】Chrome 下载属性不起作用【英文标题】:Chrome Download Attribute not working 【发布时间】:2014-07-15 09:23:28 【问题描述】:

自最新版本以来,我遇到了 Chrome 的一些意外行为: 在 Firefox 中,此代码运行良好:

<a id="playlist" class="button" download="Name.xspf" href="data:application/octet-stream;base64,PD94ANDSOON" style="display: inline;">Download Me</a>

它在 Chrome 中不工作(只需下载一个名为“下载”的文件),但以前工作得很好。我需要改变什么才能让它再次工作?

【问题讨论】:

当您在没有服务器(如本地主机)的情况下打开您的网站时也会发生这种情况,在 VS 代码中安装和使用 Ritiwick Dey 的 Live Server 扩展解决了这个问题,您也可以使用任何其他服务器,如 apache或 xampp,但安装 VS Code 的 Live Server 扩展会更容易、更快捷。 【参考方案1】:

经过一番研究,我终于找到了你的问题。

下载属性:

如果 HTTP 标头 Content-Disposition: 存在并提供与此属性不同的文件名,则 HTTP 标头优先于此属性。

如果此属性存在且 Content-Disposition: 设置为内联,Firefox 会优先考虑 Content-Disposition,就像文件名的情况一样,而 Chrome 会优先考虑下载属性。

Source

HTTP-Header Content-Disposition

【讨论】:

我的服务器似乎没有发送“Content-Disposition”,并且如您所述,Firefox 不会正确下载文件,但我的问题是相反的:Chrome 不接受下载属性,而 Firefox 可以。即使我只是创建一个简单的 html 文件,仅将其作为其内容(并以文件 URL 的形式打开),它在 Chrome 中但在 Firefox 中不起作用。在我更新 Chrome(版本 35.0.1916.114 m)之前它也有效 它在 Chrome 中对我来说也不起作用......我浏览了一些带有“试用”页面的网站,但他们的示例都不起作用,也没有我尝试制作的一些 JSFIDDLE .唯一有效的是 W3Schools 上的 this one。 这似乎是 Chrome 35 版中的一个错误:code.google.com/p/chromium/issues/detail?id=373182 @MrMesees 如果我没记错的话,浏览器不再支持下载属性,除非 href 指向同源的资源。另请参阅下面的答案 如果您可以控制服务器,则可以使用,但不是前端的解决方案。当服务器没有 Content-Disposition 标头时,我仍然无法弄清楚如何在 html 中执行此操作。【参考方案2】:

阅读 cmets,我遇到了与 @buffer-overflow 相同的问题,并在问题中找到了这个:

我猜网页和下载的来源不同。我们不再尊重跨源请求的下载属性建议文件名。单击该链接仍会启动下载。但文件名仅源自仅取决于服务器的因素(例如响应中的 Content-Disposition 标头和 URL)。

所以我没有机会让它工作...... :(

【讨论】:

HTML5 和 HTML 5.1 的 W3C 建议中没有关于该限制的内容,但您可以在 Mozilla 参考中找到。 “此属性仅适用于同源 URL。” - 来自developer.mozilla.org/en/docs/Web/HTML/Element/a#Attributes 尽管没有 Content-Disposition 标头,但我对 chrome 版本 57 也有同样的问题。我找到的唯一解决方案是让服务器添加 Content-Disposition 标头并在那里指定文件名。 我看到了完全不同的行为......它甚至没有尝试下载,而是表现得好像下载属性不存在,并且正在将页面替换为新形象!【参考方案3】:

wordpress有这个问题,问题是wordpress生成文件的完整路径,在a标签中你必须删除完整的域名并添加相对路径

示例,而不是:

<a href="http://mywordpresssite.com/wp-content/uploads/file.mp4" download="file.mp4" >

你必须这样做:

<a href="/wp-content/uploads/file.mp4" download="file.mp4">

这将使它工作

【讨论】:

这与原始问题无关,但已经解决了我的生活:) 这里也一样。如果指定了整个域,Chrome 可能会假设它来自不同的域,即使这不是真的。【参考方案4】:

我有一个关于这个问题的简单解决方案。您只需要将您的 html 文件放入使用 xampp 控件等的 Apache 之类的服务器中。因为下载属性通过服务器正常工作。

<a download href="data:application/octet-stream;base64,PD94ANDSOON">Download Me</a>

【讨论】:

不幸的是,这仅限于 1MB 的数据,至少在 Chrome 73 中是这样【参考方案5】:

这是 Chrome 中截至 2021 年 8 月 16 日的当前行为

如果您正在调用这样的 api: http://localhost:9000/api/v1/service/email/attachment/dummy.pdf

如果Content-Disposition 未设置或设置为 inline 来自服务器,在这种情况下,pdf 文件的名称将是 dummy.pdf

如果 Content-Disposition 设置为 attachment,则 chrome 将使用 Content-Disposition 标头中的 filename 值保存文件。

如果服务器是这样响应的:

res.setHeader(
  "Content-disposition",
  "attachment; filename=" + "server-dummy.pdf"
);
res.setHeader("Content-Type", "application/pdf");

无论是否存在下载属性,该文件都将保存为 server-dummy.pdf

【讨论】:

【参考方案6】:

您是通过 Web 服务器还是本地文件系统查看文件 - 浏览器的 URL 栏是否以 http:// 或 file:/// 开头? 我刚刚在 Chrome 中运行了一些测试,虽然它会下载文件,但当您使用本地文件时,它不尊重下载属性的值。

如果您开始在网络服务器上托管它,这将开始工作。如果您只是自己在计算机上执行此操作,请查看适用于 Windows 的 WAMP 或适用于 macOS 的 MAMP,以开始使用 Apache。

【讨论】:

【参考方案7】:

我建议使用file-saver NPM 包来实现或强制下载。

// 1.
npm i file-saver // install via npm or
yarn add file-saver // install via yarn

// 2.
import  saveAs  from 'file-saver'

// 3. 
saveAs('https://httpbin.org/image', 'image.jpg')

参考文献

https://www.npmjs.com/package/file-saver https://www.npmjs.com/package/file-saver#saving-urls // 指向 保存 URLs 的 URL https://www.javascripting.com/view/filesaver-js

【讨论】:

【参考方案8】:

没有服务器就无法工作。 download 属性只有在使用像 tomcat/xampp/wampserver 这样的服务器(本地/远程)时才会起作用...

<a href="videos/sample.mp4" download>Download Video</a>
<a href="images/sample.jpg" download>Download Image</a>

不仅适用于视频或图像。

【讨论】:

【参考方案9】:

文件必须是某种压缩格式!

【讨论】:

嗨!欢迎来到堆栈溢出!我建议您查看本指南,了解如何给出一个好的答案***.com/help/how-to-answer。有时,尽管您可能认为自己给出了正确的解决方案,但您应该尝试解释为什么会出现这种情况,以便为社区提供更多见解。 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案10】:

这可以通过将target="_blank" 属性添加到href 来解决。

像这样:

Save sprites.svg as 
<a target="_blank" download="somefilename.svg"
href="https://cdn.sstatic.net/Img/unified/sprites.svg"
>somefilename.svg</a>

【讨论】:

可以确认,当响应标头未指定文件名时,它适用于 Chrome 72。 不起作用,请先尝试再向他人推荐。 在 Chrome 76、FF 68 和 Edge 上为我工作【参考方案11】:

转到 Chrome 单击“设置”,您将在 Chrome 浏览器窗口中看到一个新页面弹出。向下滚动到高级设置,找到下载组,然后清除您的自动打开选项。下次您下载某个项目时,它将被保存而不是自动打开。

【讨论】:

非常适合那些不关心下载内容和名称的人——这与我们正在寻求的解决方案相反。

以上是关于Chrome 下载属性不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当 url 是 blob url 时,html5 下载属性不起作用

选择尺寸属性尺寸在 Chrome/Safari 中不起作用?

CSS3 Animate 属性在 Chrome 中不起作用,在 Firefox/IE 中起作用

Page-Break-inside 属性在 chrome 中不起作用

CSS 'transform: scale()' 属性在 iOS Safari 和 iOS Chrome 上也不起作用

CSS3颜色过渡在Chrome中不起作用