поддержка резюме и разделов в php

извините, если это не новый вопрос, но я действительно застрял в этой проблеме. Я использую приведенный ниже сценарий для загрузки большого файла, такого как фильм, я не могу позволить пользователю получить доступ к прямой ссылке на файл, также мне нужно разрешить пользователю загружать файл в виде поддержки резюме и раздела. Используя этот код, у меня просто есть поддержка резюме, а не раздел. Я использую фреймворк Yii. Пожалуйста, помогите мне в этом любым решением и предложением.

public static function downloadFile($fileLocation, $saveName = null, $maxSpeed = 100, $doStream = false){
    $start = 0;
    $end = -1;
    $section = false;
    $extension = CFileHelper::getExtension($fileLocation);
    $fileName = is_null($saveName) ? basename($fileLocation) : $saveName . '.' . $extension;
    /* @var $contentType string mime type for the file, if is null, it will be octet-stream */
    $contentType = CFileHelper::getMimeType($fileLocation);
    $contentType = is_null($contentType) ? 'application/octet-stream' : $contentType;


    if(isset($_SERVER['HTTP_RANGE']))
    {
        $range2 = substr($_SERVER['HTTP_RANGE'], strlen('bytes='));

        $range = explode('-', $range2);

        if($range[0] > 0)
            $start = intval($range[0]);
        if($range[1] > 0)
            $end = intval($range[1]);

        $section = true;
    }

    ob_end_clean();
    $old_status = ignore_user_abort(true);
    set_time_limit(0);

    $size = filesize($fileLocation);

    if($start > ($size -1)) $start = 0;

    $fp = fopen($fileLocation, 'rb');
    if($start) fseek($fp, $start);
    if($end < $start) $end = $size -1;


    header('Content-Type: '.$contentType);

    $contentDisposition = 'attachment';
    if($doStream == true){ 
        $array_listen = array('mp3','m3u','m4a','mid','ogg','ra','ram','wm', 
        'wav','wma','aac','3gp','avi','mov','mp4','mpeg','mpg','swf','wmv','divx','asf'); 
        if(in_array($extension,$array_listen)){  
            $contentDisposition = 'inline'; 
        } 
    } 

    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { 
        $fileName= preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1); 
        header("Content-Disposition: $contentDisposition; filename=\"$fileName\""); 
    } else { 
        header("Content-Disposition: $contentDisposition; filename=\"$fileName\""); 
    } 
    header('Content-Disposition: ' . $contentDisposition . '; filename="' . $fileName . '"');
    header('Last-Modified: ' . date('D, d M Y H:i:s \G\M\T', filemtime($fileLocation)));

    if($section)
    {
        header("HTTP/1.0 206 Partial Content"); 
        header("Status: 206 Partial Content"); 
        header('Accept-Ranges: bytes'); 
        header("Content-Range: bytes $start-$end/$size"); 
        header("Content-Length: " . ($end - $start + 1));   

    }else
        header('Content-Length: '.$size);

    $size = $end - $start + 1;

    while(!(connection_aborted() || connection_status() == 1) && !feof($fp))
    {
        print(fread($fp,1024*$maxSpeed)); 
        flush();
        ob_flush(); 
        sleep(1);
    }
    fclose($fp);
    ignore_user_abort($old_status);
    set_time_limit(ini_get('max_execution_time'));

}

person user3817348    schedule 13.07.2014    source источник
comment
Я надеюсь, вы понимаете, что люди здесь не просто будут писать ваш код для вас. Кроме того: здесь на сайте куча вопросов по одной и той же проблеме, по крайней мере, сначала поищите.   -  person Blizz    schedule 14.07.2014
comment
Я знаю @Blizz, я много ищу, как я уже сказал. Я не ищу того, кто напишет мой код, мне нужны подсказки, указывающие на то, что я сделал неправильно!   -  person user3817348    schedule 14.07.2014


Ответы (1)


Если вы используете apache и можете устанавливать на него моды, вы можете использовать модуль mod_xsendfile. Он поддерживает частичные загрузки, обналичивание и другие крутые штуки.

Простая демонстрация: отправлять файлы быстрее и лучше с PHP & X-файл отправки

person Olim Saidov    schedule 30.07.2014