使用php,apache创建动态,可过期和可恢复的下载链接

时间:2012-06-14 15:11:59

标签: php apache security download

以下是问题详情:

1)我想创建动态(基于IP)的下载链接。因此,用户无法使用相同的下载链接下载具有不同IP的文件。

2)在开始实际下载之前,我想使用php记录此下载请求并执行一些检查(验证http referrer)以允许用户下载实际文件。

3)我还希望下载文件可以恢复,并且可以使用下载管理器(具有多个下载实例)下载。还希望限制每次下载的最大允许实例数。

4)文件大小可能超过200 MB。

所以,我想的解决方案是使用用户ip的md5哈希创建下载链接。例如。 http://yourdomain.com/download.php?ip_hash=hash-of-the-ip&file=file-to-download

这只是一个例子,但我们也可以使用htaccess创建一个很好的链接。

接下来我该怎么办?我试着用

header("Content-Type: $ctype");
header("Content-Length: " . filesize($file));
header("Content-Disposition: attachment; filename=\"$fileName\"");
readfile($file);

但使用此功能后,最终用户无法继续下载。

使用此方法发送大文件是否可以?

在做了一些研究之后,我发现.exe文件使用这种方式对最终用户来说已经损坏了。

1 个答案:

答案 0 :(得分:1)

在做了一些研究之后,我找到了问题的答案。我只是想我也应该和你们分享。

正如rambo评论的那样,我们可以使用apache服务器的mod_xsendfile模块。如果禁用,我们需要启用它。

如果你的apache没有这个模块,下面是下载模块文件的链接。它主要适用于所有版本的apache,可用于x32和x64 https://github.com/nmaier/mod_xsendfile

在完成所有自定义验证后,您可以使用以下代码使用此apache模块发送文件。

<?php
//We want to force a download box with the filename hello.txt
header('Content-Disposition: attachment;filename=hello.txt');

//File is located at data/hello.txt
header('X-Sendfile: data/hello.txt');
?>

我希望它会帮助你们:)