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

Тема в разделе "PrestaShop", создана пользователем alexen_zhukov, 10 май 2019.

Информация :
Приветствую гость, обрати внимание! Темы которые закреплены в разделах, в скором времени будут откреплены. Правила раздела PrestaShop

(Не актуальные темы) Каталоги:Модули PrestaShop 1.7Модули PrestaShop 1.5 - 1.6Шаблоны PrestaShop 1.7Шаблоны PrestaShop 1.5 - 1.6
(Не актуальные темы) Поиск / Запросы:Модули PrestaShop 1.7Модули PrestaShop 1.5 - 1.6Шаблоны PrestaShop 1.7Шаблоны PrestaShop 1.5 - 1.6
Полезная информация:Поддержка и помощь c PrestaShopУбираем ПрестаТраст, стучалки и прочую рекламуСовместные покупки модулей и шаблоновПеревод Prestashop и модулей
Модераторы: trace
  1. alexen_zhukov

    alexen_zhukov Постоялец

    Регистр.:
    4 мар 2013
    Сообщения:
    64
    Симпатии:
    68
    Сайт продает виртуальные продукты, рзмер файлов варьируется от 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 отзовитесь.
     
    Последнее редактирование: 10 май 2019
  2. alexen_zhukov

    alexen_zhukov Постоялец

    Регистр.:
    4 мар 2013
    Сообщения:
    64
    Симпатии:
    68
    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;
    
    
     
    Последнее редактирование: 11 май 2019