如果我出错了,第一次发帖很抱歉。
我正在尝试创建一个安全的文件下载店面。实际上它有效,但只有小文件。我有一个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());
我没有收到关于失败的大型文件的最终错误日志电子邮件,但我确实收到了成功的小文件的电子邮件,所以我知道代码原则上有效。
答案 0 :(得分:1)
原来我的主机是问题。 PHP代码是正确的,但我的共享托管环境将所有PHP脚本限制为30秒,在上述代码的情况下,运行其过程大约需要15分钟。除非有人能够提出一种方法来保持PHP在文件处理方法中的作用,这种方法对计时器没有贡献,所以看起来这样就卡住了。
答案 1 :(得分:0)
试试这个
set_time_limit(0);
答案 2 :(得分:0)
我遇到了同样的问题,因此我想到了不同的方法。 当请求文件时,我在“下载”文件夹中的随机命名目录中建立文件的硬链接,并为用户提供4个小时的链接。
文件url就是这样。
http://example.com/downloads/3nd83js92kj29dmcb39dj39/myfile.zip
每次调用脚本都会解析“下载”文件夹,并删除所有创建时间超过4个小时的文件夹及其内容,以保持文件干净。
这对于蛮力攻击并不安全,但是可以解决。