2013-10-14 2 views
0

Эй я следующий код, чтобы загрузить большой файл, но загрузка делает остановки каждый раз без Закончите скачатьЗагрузка больших файлов не работает

function download($file) 
{ 
    include('logger.php5'); 
    $log = new Logging(); 
    $log->lfile('download.log'); 
    ini_set('max_execution_time', 86400); 
    //header('Location: '.$file); 
    $filesize = filesize($file); 
    $filename = pathinfo($file, PATHINFO_BASENAME); 
    $filext = pathinfo($file, PATHINFO_EXTENSION); 
    $mime = include('mime.php5'); 

    $log->lwrite(ini_get('max_execution_time')); 
    $log->lwrite(sprintf('%s %s %s %s', $filename, $filext, $mime[$filext], human_filesize($filesize))); 
    $log->lclose(); 
    @ob_end_clean(); 
    session_write_close(); 
    header("Content-Description: File Transfer"); 
    header("Content-Type: ".$mime[$filext]); 
    header("Content-Disposition: ". 
    (!strpos($HTTP_USER_AGENT,"MSIE 5.5")?"attachment; ":""). 
    "filename=".$filename); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: ".$filesize); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: public"); 
    header('Pragma: public'); 
    header('Expires: 0'); 
    $done = readfile_chunked($file); 
} 

function readfile_chunked($filename,$retbytes=true) { 
    $chunksize = 1*(1024*1024); // how many bytes per chunk 
    $buffer = ''; 
    $cnt =0; 
    // $handle = fopen($filename, 'rb'); 
    $handle = fopen($filename, 'rb'); 
    if ($handle === false) { 
     return false; 
    } 
    while (!feof($handle)) { 
     $buffer = fread($handle, $chunksize); 
     echo $buffer; 
     ob_flush(); 
     flush(); 
     if ($retbytes) { 
      $cnt += strlen($buffer); 
     } 
    } 
     $status = fclose($handle); 
    if ($retbytes && $status) { 
     return $cnt; // return num. bytes delivered like readfile() does. 
    } 
    return $status; 
} 

Каждый раз, когда я называю сценарий загрузки запускается, но останавливается после того, как 400 МБ, сам файл имеет размер 778 МБ.

У кого-то есть проблемы с кодом?

UPDATE

после попытки войти возвращаемое значение readfile_chunked он чувствует, как скрипт получает купирован не сам скачать. Потому что я не могу получить запись в журнале после вызова readfile_chunked.

+0

все заголовки установлены внутри функции 'download' снаружи - это всего лишь материал безопасности, чтобы определить нужный файл –

+0

Да, правильные заголовки отправляются. –

+0

Когда вы говорите, что загрузка останавливается, вы имеете в виду, что клиент получает только 400 МБ? Или вы имеете в виду, что функция 'readfile_chunked' возвращает счет 400 МБ? Или оба? –

ответ

-1

Это может быть проблема с функцией filesize в PHP. Есть известные ошибки для большого чтения размера файла и, как вы отправляете его с файлом в качестве заголовка я хотел бы предложить вам попробовать скрипт без использования этой строки:

header("Content-Length: ".$filesize); 

Ох, и, может быть, вы можете взглянуть в этой строке:

header("Content-Transfer-Encoding: binary"); 

Я думаю, что кодировка должна быть проверена для каждого файла. Например:

$finfo = finfo_open(FILEINFO_MIME); 

//check to see if the mime-type starts with 'text' 
return substr(finfo_file($finfo, $filename), 0, 4) == 'text'; 

Если это текстовый файл, вы должны использовать ASCII ofcourse. Не имеет никакого отношения к вопросу, но я думаю, что это полезное дополнение к вашему сценарию :)

Смежные вопросы