我有一个带有文件下载选项的网站。然而,并不是每个人都可以下载每个文件。例如,如果我以管理员身份登录,我可以下载所有文件,但如果我以客户身份登录,我只能下载某些文件。

目前所有这些文件都存储在 Web 根目录之外的目录中,因此用户无法手动下载它们。我制作了一个 PHP 脚本来管理文件的下载,但它有很多问题。我尝试了几件事:

1:

echo file_get_contents($file);

2:
readfile($file);

3:
if (($handle = fopen($file, "rb")) !== false)
{
  while (!feof($handle))
  {
    echo fread($handle, 4096);
  }
  fclose($handle);
}

我发现在使用 500MB 文件进行测试时,所有这些方法都非常不可靠。第一个和第二个都失败,所有浏览器和随机百分比。有时他们在几兆字节后就已经失败了,而其他时候他们甚至达到了 80%。但最终他们会停止下载而不会出现任何错误。

第三种方法最可靠。它在 Firefox 中下载得很好(虽然速度太慢;大约 700KB/s,而它来自本地主机,而 readfile-method 在它工作时以 25MB/s 运行)和 Chrome,但在 Internet Explorer 中它大多失败。在 IE 中,它首先卡在“获取文件信息”上,而没有获得任何“打开/保存”对话框。当我取消它并重试时,我得到一个“打开/保存”对话框。

我在互联网上搜索,我找不到任何令人满意的实际效果很好的方法。最好我只希望 Apache 处理文件下载,因为它总是完美无缺地工作。但我不想把所有文件都放到一个公共(public)目录中,因为这样每个人都可以下载所有文件。

我有哪些选择?有没有最好的方法?

最佳答案

1) 和 2) 会因为大文件而中断,因为它们用文件的内容填充了脚本的内存。内存限制通常是 32 或 64 MB 左右,取更高的值是不明智的。

第 3 种方法应该很有效,因为它不会填满脚本的内存;但是,请记住发送正确的 content-typecontent-length header 。

有一种替代方法可以通过 PHP 传递文件,我没有使用过我自己但似乎运行良好的 X-Sendfile header 。

关于php - Apache 和 PHP 的选择性文件下载权限,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4145314/

10-14 22:48
查看更多