13

I want to host on my webpage an external url containing a mp3 file. The problem is that clicking on that link will open the player, i have to right click and "Save link as" in order to download the file. Is there any solution to force the file download?

I don't want to download the file and then use headers to force the download.

4

2 回答 2

17

现在HTML5 规范在超链接上定义了一个非常有用的属性,它基本上允许在客户端强制下载行为,而download不管来自服务器的内容是什么:Content-TypeContent-Disposition

在某些情况下,资源旨在供以后使用,而不是立即查看。为了指示资源打算被下载以供以后使用,而不是立即使用,可以在创建该 资源的or元素download 上指定属性。aareahyperlink

<...>

如果存在该download属性,则表明作者打算将超链接用于下载资源。属性可能有值;该值(如果有)指定作者推荐用于标记本地文件系统中的资源的默认文件名。

所以你需要做的就是将属性添加到你的超链接中,支持它的浏览器会明白需要下载内容:

<a href="http://example.com/media.mp3" download>Download Your File</a>

您甚至可以通过设置属性值来为下载的文件建议一个不同的名称:

<a href="http://example.com/media.mp3" download="check this out.mp3">Download Your File</a>

更多信息和演示:

浏览器支持:caniuse.com


下载生成的内容

您甚至可以创建一个链接来下载您生成的内容,只要有办法为其获取 base64 编码的数据 URI:

<a href="data:application/octet-stream;base64,YOUR_ENCODED_DATA" download="song.mp3">Download</a>

有关保存生成内容的更多详细信息,请参阅 Eli Grey 的这篇文章:

在客户端保存生成的文件

于 2013-04-12T11:26:33.080 回答
3

编辑:如果您仅控制目标 MP3 文件,则以下答案适用,如果它是外部链接则不适用

该链接不应直接指向 MP3 文件,而是指向一段逻辑(例如,您使用的是 ASPX 吗?在这种情况下,您可以使用 .aspx 页面作为目标,或者您可以为 .aspx 页面创建一个 HTTP 处理程序。 mp3 扩展名),它将HTTP 标头添加到包含以下行的输出中:

Content-Disposition: attachment;filename="whatever.mp3";

这将指示浏览器将输出的内容视为要在本地保存的文件。

于 2012-11-19T10:20:47.683 回答