PHP下载大文件问题

时间:2012-08-29 07:47:07

标签: php download large-files

我使用以下代码下载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();
        }

1 个答案:

答案 0 :(得分:0)

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