2014-10-01 2 views
2

Я пытаюсь получить ссылку для загрузки файлов без перенаправления или использования другого файла для загрузки больших ZIP-файлов.Загрузка php не удалась на больших файлах

Он отлично работает для файлов под ~ 100mb, но что-то большее и отправляется на страницу с ошибкой в ​​хроме, которая гласит: Error code: ERR_INVALID_RESPONSE.

$ file и $ path помещаются в форму с jQuery, а затем вызывается $('form').submit();.

function downloadFile($file, $path){ 

     set_time_limit(0); 
     $fullPath = $path . $file; 

     if ($fd = fopen ($fullPath, "r")) { 


      $fsize = filesize($fullPath); 
      $path_parts = pathinfo($fullPath); 



      $ext = strtolower($path_parts["extension"]); 
      switch ($ext) { 
       case "pdf": 
       header("Content-type: application/pdf"); // add here more headers for diff. extensions 
       header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download 
       break; 
       default; 
       header("Content-type: application/octet-stream"); 
       header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); 
      } 
      header("Content-length: $fsize"); 
      header("Cache-control: private"); //use this to open files directly 
      while(!feof($fd)) { 
       $buffer = fread($fd, 2048); 
       echo $buffer; 
      } 
     } 
     fclose ($fd); 
     exit; 
    } 

Любые идеи, почему это не удается в больших файлах?

Update: Когда я использую следующий код, он загружает файл, но готовый файл не открывается, как он поврежден по какой-то причине:

set_time_limit(0); 
ini_set('memory_limit', '1024M'); 
// http headers for downloads 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"".$filename."\""); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".$file_size); 
ob_end_flush(); 
@readfile($fileinfo['path']); 

Когда я использую этот код, он только загружает первый 49.7kb то говорит, что это закончено, я даже пытался ob_flush() и flush() вместе:

// http headers for downloads 
    header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=\"".$filename."\""); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: ".filesize($fileinfo['path'])); 

    if ($fd = fopen ($fileinfo['path'], "r")) { 

      set_time_limit(0); 
      ini_set('memory_limit', '1024M'); 

     while(!feof($fd)) { 
      echo fread($fd, 4096); 
      flush(); 
     } 

    } 
+1

Проверьте, что максимальное ограничение по размеру загрузки находится в вашем файле 'php.ini'. –

+0

Не уверен, что это проблема, пожалуйста, посмотрите мои обновления. – David

ответ

4

Единственное, что я делаю разные в моем загрузчиком является Content-Transfer-Encoding: chunked. Также вытащите flush() из цикла и убедитесь, что вы сделали ob_clean(); flush(); до и ob_end_flush(); после отправки данных.

+0

ob_clean(); промывать(); до времени или в то время? – David

+0

Перед 'while' ... – MBaas

+0

Хорошо работает отлично. минус тот факт, что он выплескивает тарабарщину в консоль, если она открыта. echo fread ($ fd, 4096) вызывает это, но удаление его останавливает его от работы – David

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