第一次发布,如果发现任何错误,抱歉。
我正在尝试创建一个安全的文件下载店面。实际上,它可以工作,但仅适用于小文件。我有1.9gb产品要下载,并且在传输过程中一直停下来。大小也不一致,我的最大容量为1GB,但通常为200-500mb。
目的是创建一个空间,只有拥有注册帐户的用户才能下载文件,因此无法直接链接。
我在本网站的其他地方读到,在文件读取循环中重置脚本超时应该绕过脚本时间限制。
try
{
$num_bytes = filesize ("products/" . $filename);
$mp3content = fopen("products/" . $filename, "rb") or die("Couldn't get handle");
$bytes_read=0;
if ($mp3content) {
while (!feof($mp3content)) {
set_time_limit(30);
$buffer = fread($mp3content, 4096);
echo $buffer;
$bytes_read+=4096;
}
fclose($handle);
}
}
catch (Exception $e)
{
error_log("User failed to download file: " . $row['FILENAME'] . "(" . $row['MIMETYPE'] . ")\n" . $e, 1, getErrorEmail());
}
error_log("Bytes downloaded:" . $bytes_read . " of " . $num_bytes, 1, getErrorEmail());
我没有收到有关失败的大型文件的最终错误日志电子邮件,但是我确实收到了有关成功的较小文件的电子邮件,因此我知道代码在原则上是可行的。
原来我的托管是问题。 PHP代码是正确的,但是我的共享托管环境将所有php脚本限制为30秒,在上述代码的情况下,该过程大约需要15分钟。除非有人能提出一种使PHP捆绑在对计时器没有帮助的文件处理方法中的方法,否则看起来这很困难。
尝试这个
set_time_limit(0);
我遇到了同样的问题,所以我想到了不同的方法。当请求文件时,我在“下载”文件夹中的随机命名目录中建立文件的硬链接,并为用户提供4个小时的链接。
文件URL这样完成。
http://example.com/downloads/3nd83js92kj29dmcb39dj39/myfile.zip
每次调用该脚本都会解析“下载”文件夹,并删除所有具有超过4个小时创建时间的文件夹及其内容,以保持文件的清洁。
这对于暴力攻击并不安全,但是可以解决。