Помощь Прерывается загрузка virtual products - докачка возможна?

alexen_zhukov

Постоялец
Регистрация
4 Мар 2013
Сообщения
132
Реакции
186
Сайт продает виртуальные продукты, рзмер файлов варьируется от 5 до 350 Мб. Часто при скачивании больших файлов закачка прерывается, может и на 90 Мб и на 300 Мб. Вариант скачивать заново, но часто в больших закачках не удается даже при повторных попытках. По Ftp все гладко и понятно.

В престашопе за это отвечает GetFileController.php, основной код такой: (практически не менялся с версии 1.6). Текущая 1.7.5.1


Код:
/* Set headers for download */
        header('Content-Transfer-Encoding: binary');
        header('Content-Type: ' . $mimeType);
        header('Content-Length: ' . filesize($file));
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        //prevents max execution timeout, when reading large files
        @set_time_limit(0);
        $fp = fopen($file, 'rb');

        if ($fp && is_resource($fp)) {
            while (!feof($fp)) {
                echo fgets($fp, 16384);
            }
        }

Хотелось бы добавить возможность докачки или может известно другое решение по увеличению надежности скачивания. Хорошие знатоки PHP отзовитесь.
 
Последнее редактирование:
UPD2
Скрипт для скачивания рабочий, но докачка протестирована удачно пока только в Download master. Файл 256 Мб
В Safari - докачка не работает
В Chrome - скачал, но докачка не работает


Код:
     set_time_limit(0);
         $size=filesize($file);


         $fp=@fopen($file,'rb');
          if(!$fp)
          { header ($_SERVER['SERVER_PROTOCOL'].'Internal server error');
               return;
          }
          $begin=0;
          $end=$size;
          if(isset($_SERVER['HTTP_RANGE']))
          { if(preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
               { $begin = floatval($matches[1]) ;
                   if( !empty($matches[2]) ) {
                  $end = floatval($matches[1]);
                   }
                }
             }
             
             if($begin>0||$end<$size)
             {
                header($_SERVER['SERVER_PROTOCOL'].' 206 Partial Content');
                  header('Content-Range: bytes ' . $begin . '-' . $end . '/' . $size . ';');
            }else{
                    header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
            }
           
            header('Accept-Ranges: bytes');                            
            header('Content-Type: ' . $mimeType);
            header('Content-Description: File Transfer');  
            header('Content-Disposition: attachment; filename="' . $filename . '"');  
            header('Content-Transfer-Encoding: binary');
            header('Content-Length:'.($end-$begin));
            //header('Last-Modified: $time');
             header('Connection: close');  

                    $cur=$begin;
                    fseek($fp,$begin,0);

                    while(!feof($fp)&&$cur<$end&&(connection_status()==0))
                     { 
                            echo fread($fp,min(1024*16,$end-$cur));
                            flush();
                            ob_flush();
                            $cur+=1024*16;

                      }
                    fclose($fp);
                    exit;
 
Последнее редактирование:
Назад
Сверху