2011-03-05 162 views
0

我正在开发一个Web服务。使用此服务,用户将上传文件.php文件,服务将从php文件中删除UTF8 BOM字符。然后,将有一个像这样的链接:强制下载文件

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

但是当我点击这个链接,浏览器浏览到该文件。我不想浏览它,我想下载它。所以,当用户点击这个链接时,下载将开始。

任何想法?

(PS我不想修改uploadedfile.php文件,也是我读到这5个问题,但我仍然有问题。)

+1

您将需要修改'uploadedfile.php'。无法绕过它 – 2011-03-05 22:23:14

+0

但是用户会下载'uploadedfile.php'? – Eray 2011-03-05 22:26:43

+1

当前的形式,你将*执行*上传的文件,这是一个不允许的。你需要一个传输脚本来发送正确的头文件并传递文件的源代码 – 2011-03-05 22:33:47

回答

1

的问题是,你允许人们上传PHP文件在您的服务器上,然后给他们一个链接来执行该PHP文件。 Web服务器会自动处理那些上传的PHP文件,就像其他任何PHP文件一样,即执行它,这会使您面临巨大的安全漏洞。

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

这样一个脚本的URL看起来像:

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

这将在id与服务器上的文件链接的价值,如果你在什么地方保存原来的文件名(平面文件,DB ),只要您设置正确的HTTP标头,就可以使用其原始名称来提供它。

4

您需要提供此HTTP标头:通过适当地配置你的Web服务器在同一时间

Content-Disposition: attachment; filename=example.txt 

您通常可以指定这为整个目录。如果您提到您正在使用哪个Web服务器,有人可能会建议如何执行此操作。

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文件很大并且连接速度很慢,那么它们的进度条将是准确的(因为您已经预先刷新了内容长度)。