强制下载文件

时间:2011-03-05 22:21:32

标签: php file download

我正在开发一项网络服务。使用此服务,用户将上传其 .php 文件,服务将从php文件中删除UTF8 BOM字符。然后,会有这样一个链接:

<a href="uploads/as8df7/uploadedfile.php">Download Your File</a>

但是当我点击此链接时,浏览器浏览到此文件。我不想浏览它,我想下载它。因此,当用户单击此链接时,将开始下载。

有什么想法吗?

(P.S。我不想修改 uploadedfile.php 文件,我也读了5个关于此的问题,但我仍然有问题。)

3 个答案:

答案 0 :(得分:4)

您需要提供此HTTP标头:

Content-Disposition: attachment; filename=example.txt

通常可以通过适当地配置Web服务器,一次为整个目录指定此项。如果你提到你正在使用的网络服务器,有人可能会建议如何做到这一点。

答案 1 :(得分:1)

问题在于,您允许人们在您的服务器上上传PHP文件,然后为他们提供执行该PHP文件的链接。 Web服务器会像任何其他PHP文件一样自动处理这些上传的PHP文件,即执行它,这会让您面临巨大的安全漏洞。

无论您的网络服务有什么用途,我建议您在服务器上传文件时重命名该文件(“随机”最好,没有扩展名),然后让PHP脚本将其反馈给相应的标题在请求时设置。

此类脚本的URL如下所示:

http://www.example.com/get_uploaded_file.php?id=jgh3h8gjdj2389

它会将id中的值与服务器上的文件相关联,如果您已将原始文件名保存在某处(平面文件,数据库),则可以使用其原始名称将其提供,在设置正确的HTTP标头时。

答案 2 :(得分:0)

直接链接到PHP文件可能最终会执行它。一种方法是(像上面建议的那样)重命名它。或者,您可以使用下面的downloader.php:

<?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 01 Jan 2000 01:00:00 GMT'); // some date in past
header('Content-type: text/plain');
header('Content-Disposition: attachment; filename='.basename($filepath));
header('Content-Length: ' . filesize($filepath));
flush(); // or any other flush function/mechanism you use.
readfile($filepath);

并将其链接为: <a href="./downloader.php?fileid=4ba213">Download</a>

此方法可让您保留.php扩展名。此外,如果PHP文件很大并且连接速度很慢,那么它们的进度条就是准确的(因为你已经预先刷新了内容长度。