一个PHP脚本让用户从我的网站上下载一个文件,而不会泄露我网站上的实际文件链接?

问题描述:

这个问题说明了一切..我如何让用户从我的网站下载文件,并且而不是让他们看看该文件来自哪个链接?我知道可能需要类似download.php这将作为网关,但过去的阶段,我不知道接下来的脚本...如果它困扰你编写整个代码,一些函数我应该需要使用的名字将非常方便!一个PHP脚本让用户从我的网站上下载一个文件,而不会泄露我网站上的实际文件链接?

找到一种识别要下载的文件的方法(例如,与数据库中某行的ID匹配的GET变量,或者沿着这些行的东西)。确保它是有效的,因为你不希望你的用户能够从你的网站下载任何东西。然后,使用headerContent-Disposition来告诉浏览器文件应该被下载,并且readfile来输出它。

例如:

<?php 

$id = intval($_GET['id']); 
$query = mysql_query('SELECT file_path FROM files WHERE id = ' . $id); 
if (($row = mysql_fetch_row($query)) !== false) 
{ 
    header('Content-Disposition: attachment; filename=' . basename($row[0])); 
    readfile($row[0]); 
} 
exit; 

?> 
+0

我记得使用类似的技术在csv文件中导出电子邮件地址。 Safari的mac为内容类型标头忽略。 – Keyo 2010-07-15 05:15:59

+0

这个脚本是否支持htaccess?我有一个htaccess规则来拒绝在方法被绕过的情况下访问真正的URL。 “所有人都拒绝”是否也会影响到这个脚本? – 2016-12-28 19:36:38

+0

@CodigosTutoriales,.htaccess文件中的规则只会影响来自客户端的Web请求。他们不会阻止您的服务器代码读取服务器上的文件。 – zneak 2016-12-28 19:39:23

可以使用header()功能是documented here

我建议向下滚动,并期待在第1例。它似乎正在做你想要的东西。

+0

只是Shedo Chung-Hee Surasi的一个注释 - 第二个例子还告诉你如何指定一个不同于原始文件名的文件名(正如你在你的问题中提到的那样)。 – jerebear 2010-07-15 04:27:53

readfile应该做你想要什么。将实际文件放在Web服务器根目录之外,并在传回文件之前需要一些凭据。

你不能让别人从URL下载文件而不让他们知道URL。在HTTP规范下是不可能的。下载的任何东西都有一个URL。

但是,您可以拥有只能使用一次的下载网址,或者需要通过POST方法传递一些特定信息。您在GET或POST变量中检查一个标记,并在该标记使用一次后使其无效。