最近完善下载类中一个远程下载文件 考虑是不是可以分别分段读取文件内容 最后组合。经测试可行哦~ 这是我测试的本地文件~
我想的是咋个可以最简单封装针对任意本地文件 or远程文件 进行操作! 请看:
<?php
//PHP分段读取文件 这里我只分了两段 实际上可以通过文件大小 按照预定段大小 进行分段..
$file = dirname(__FILE__).'/bullyframework_zend.7z';echo filesize($file);$handle = fopen($file, "rb");$contents = fread($handle, ceil(filesize($file)/2)); //分两次读取文件组合$now_tell = ftell($handle); //获取当前指针$end = fread($handle, filesize($file) - $now_tell); //从当前指针处读取剩余文件fclose($handle);file_put_contents('test.7z', $contents.$end); //写入文件 验证文件是否完整echo "<br>";echo filesize('test.7z');
?>

解决方案 »

  1.   

    分块下载需要双方都支持“断点续传”一般下载工具都支持,所以你需要做的是服务器端。php实现的断点续传服务大致如下    //   Begin writing headers 
        header("Cache-Control:"); 
        header("Cache-Control: public"); 
        header("Content-Type: $ctype");     $filespaces = str_replace("_", " ", $filename); 
        // if your filename contains underscores, replace them with spaces     $header='Content-Disposition: attachment; filename='.$filespaces; 
        header($header); 
        header("Accept-Ranges: bytes"); 
         
        $size = filesize($file);    
        //   check if http_range is sent by browser (or download manager)    
        if(isset($_SERVER['HTTP_RANGE'])) { 
            // if yes, download missing part               $seek_range = substr($_SERVER['HTTP_RANGE'] , 6); 
            $range = explode( '-', $seek_range); 
             if($range[0] > 0) { $seek_start = intval($range[0]); } 
             if($range[1] > 0) { $seek_end  =  intval($range[1]); } 
                 
            header("HTTP/1.1 206 Partial Content"); 
            header("Content-Length: " . ($seek_end - $seek_start + 1)); 
            header("Content-Range: bytes $seek_start-$seek_end/$size"); 
         } else { 
            header("Content-Range: bytes 0-$seek_end/$size"); 
            header("Content-Length: $size"); 
         }    
        //open the file 
        $fp = fopen("$file","rb"); 
         
        //seek to start of missing part    
        fseek($fp,$seek_start); 
        
        //start buffered download 
        $n = 0;
        while(!feof($fp)) {        
            //reset time limit for big files 
            echo fread($fp,1024*$speed); 
         } 
        fclose($fp); 
         exit;