1

我使用以下代码下载一个大文件,如 250mb:

if(file_exists($leadon)) 
    {
        set_time_limit(0);
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.$file_name);
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($leadon));
        header('Content-Description: File Transfer');
        ob_clean();
        flush();
        readfile($leadon);
        exit;
    }
    die();

但是根据互联网的速度,文件被部分下载,如 18mb 到 75mb。服务器管理员告诉我,我触发了 500 错误代码(内部错误)并且服务器安全认为它受到攻击并阻止我的 IP,请帮助我,什么可能导致触发内部错误或安全漏洞?

我将它复制到一个临时目录并让用户通过标题(重定向)下载并删除超过 24 小时的文件,然后重新加载页面并请求任何其他文件下载。我已经给出了下面的代码,如果有更好的解决方案,请告诉我。

if(file_exists($leadon)) 
        {
            $temp_folder    =   time();
            $olderTime      =   $temp_folder-(24*60*60);
            $temp_dir   =   $tempdir.$temp_folder;
            create_dir($temp_dir, 0775);
            $dirs   =   glob($tempdir.'*'); // get all file names
            foreach($dirs as $dir)
                { // iterate files
                if(is_dir($dir)) 
                    {
                    $temp_dir_name  =   explode('/',$dir);
                    $dir_name       =   $temp_dir_name['1'];
                    if(intval($dir_name) < intval($olderTime))
                        {
                        deleteDir($dir);
                        }
                    }
                }
            set_time_limit(0); //Set the execution time to infinite.
            $file_name  =   str_replace(' ', '_',  basename($leadon));
            // 
            $temp_file  =   $temp_dir."/".$file_name;
            copy($leadon, $temp_file);
            header('Location: '.$doman_name.'/'.$temp_file);
            exit();
        }
4

1 回答 1

0

为什么要使用 PHP 编写文件作为输出?如何将文件保存在 Web 服务器目录中的某个位置并将用户重定向到相同的位置?让您的网络服务器完成提供文件的任务,不是吗?

于 2012-08-29T08:03:50.997 回答