2

抱歉,如果这不是一个新问题,但我真的陷入了这个问题。我正在使用下面的脚本来下载像电影这样的大文件,我不能让用户访问文件的直接链接,我还需要让用户以简历和部分支持的方式下载文件。使用此代码,我只有简历支持,而不是部分。我正在使用 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'));

}
4

1 回答 1

0

如果您使用的是 apache 并且能够为其安装 mods,则可以使用mod_xsendfile模块。它支持部分下载、兑现和其他很酷的东西。

简单演示:使用 PHP 和 X-Sendfile 更快更好地发送文件

于 2014-07-30T13:48:36.740 回答