2

第一次发帖,如果有什么不对的地方很抱歉。

我正在尝试创建一个安全的文件下载店面。实际上它有效,但仅适用于小文件。我有一个 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());

我没有收到关于失败的大文件的最终错误日志电子邮件,但我确实收到了关于成功的小文件的电子邮件,所以我知道代码原则上是有效的。

4

3 回答 3

1

原来我的托管是问题所在。PHP 代码是正确的,但我的共享托管环境将所有 php 脚本限制为 30 秒,对于上面的代码,运行过程大约需要 15 分钟。除非有人能想出一种方法让 PHP 与对计时器没有贡献的文件处理方法捆绑在一起,否则看起来这个方法被卡住了。

于 2014-11-15T12:42:26.413 回答
0

试试这个

set_time_limit(0);
于 2014-11-15T11:08:09.980 回答
0

我有同样的问题,所以我想了一个不同的方法。当请求文件时,我在“下载”文件夹内的随机命名目录中创建文件的硬链接,并为用户提供 4 小时的链接。

文件 url 完成是这样的。

http://example.com/downloads/3nd83js92kj29dmcb39dj39/myfile.zip

对脚本的每次调用都会解析“下载”文件夹并删除所有创建时间超过 4 小时的文件夹及其内容,以保持内容干净。

这对于蛮力攻击是不安全的,但可以解决。

于 2019-12-17T07:47:02.413 回答