2014-07-13 36 views
2

对不起,如果这不是一个新问题,但我真的卡在这个问题。我正在使用下面的脚本来下载像电影这样的大文件,我不能让用户访问文件的直接链接,也需要让用户以简历和部分支持的方式下载文件。使用这个代码我只有简历支持,而不是部分。我正在使用Yii框架。 请通过任何解决方案和建议来帮助我。恢复和部分支持在PHP

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')); 

} 
+0

我希望你明白,这里的人不只是会写你的代码你。此外:网站上还有很多关于同一问题的问题,至少首先要做的是搜索。 – Blizz

+0

我知道@Blizz,我做了很多搜索,正如我所说的。我不在寻找写我的代码的人,我需要一些线索指出我做错了什么! – user3817348

回答