如何实现Content-Disposition: attachment?

19

我想让访问我的网站的用户通过左键单击下载mp3文件,而不是右键点击并选择“另存为”。为了实现这个目的,我需要设置Content-Disposition: attachment。由于这是我第一个网站,我不太清楚如何实际操作,我应该在HTML标记中进行设置还是通过我的托管网站进行设置?

以下是我的标记示例:

<div class="download">
<a href="MP3/Morgan Page, Sultan & Ned Shepard, and BT feat. Angela McCluskey.mp3" 
<img src="img/dlicon.png"/></a>
</div>

3
这是一项需要在服务器端操作的任务,不能通过客户端HTML代码完成。你需要在服务器上编写一个脚本作为下载服务器,由该脚本发出Content-Disposition头来实现下载。 - Marc B
你能提供更多的信息吗?你使用的是哪个Web服务器? - Ramesh Soni
我正在使用HostGator.com。 - Jean Hules
3个回答

25

MP3列表示例:

<a href="download.php?file=testing.mp3">Download MP3</a>
<a href="download.php?file=testing2.mp3">Download MP3</a>

download.php :

<?php

$file = $_GET['file'];  

header('Content-type: audio/mpeg');

header('Content-Disposition: attachment; filename="'.$file.'"');

?>

4
如果文件名中含有双引号或非ASCII字符(详见RFC 6266),上述代码将无法正常运行。 - Julian Reschke
@JulianReschke 是的,OP 应该替换文件名(请参见问题,文件名为:Morgan Page、Sultan & Ned Shepard 和 BT feat. Angela McCluskey.mp3)。我会更新我的答案。 - Zul
6
注意:除非您实际需要对mp3进行访问控制,否则最好只配置服务器以设置content-disposition头来提供这些mp3。使用PHP作为文件服务器会使事情变慢一点,特别是对于大文件。 - Sam Dufel
8
这段代码存在恶意文件包含漏洞。请始终验证 $_GET['file'] 变量! - Alex Kolarski
@SamDufel - 你建议的做法我该怎么实现?谢谢。 - user4752928

4
正如其他人所说,你不应该在HTML中这样做,使用动态解决方案(例如使用PHP)是过度的。
在你的情况下,我会在Web服务器配置中配置Content-Disposition头文件。对于Apache,你可以基于位置设置标题(based on location),或者拥有一个.htaccess文件来匹配某些文件名。

2
这种情况在应用程序开发中经常出现,需要一种动态解决方案。例如,在允许特权内容之前必须进行身份验证时,身份验证检查和文件流通常需要来自同一个请求。 - JoshuaDavid

1

7
注意:http_send_content_disposition 不是本地可用的函数,而是通过 PECL 扩展 PECL pecl_http >= 0.10.0 实现的。 - zamnuts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接