-
- /**PHP 다운로드 클래스, 중단점 재개 다운로드 지원
- * 날짜: 2013-06-30
- * 작성자: fdipzone
- * 버전: 1.0
- * 편집: ww.jbxue.com
- * Func:
- * download: 파일 다운로드
- * setSpeed: 다운로드 속도 설정
- * getRange: 헤더에서 범위 가져오기
- */
-
- class FileDownload{ // 수업 시작
-
- 비공개 $_speed = 512; // 다운로드 속도
-
- /**Download
- * @param String $file 다운로드할 파일 경로
- * @param String $name 파일명, 비어 있으면 다운로드한 파일명과 동일
- * @param boolean $reload 중단점 연속 통과 활성화 여부
- */
- 공개 함수 다운로드($file, $name='', $reload=false){
- if(file_exists($file) ){
- if($name==''){
- $name = basename($file);
- }
-
- $fp = fopen($file, 'rb');
- $file_size = 파일 크기($file);
- $ranges = $this->getRange($file_size);
-
- header('cache-control:public');
- header('콘텐츠 유형:응용 프로그램/옥텟-스트림');
- header('content-disposition:attachment; 파일 이름='.$name);
-
- if($reload && $ranges!=null){ // 사용예제
- header('HTTP/1.1 206 부분 콘텐츠');
- header('Accept-Ranges:bytes');
-
- // 剩余长titude
- header(sprintf('content-length:%u',$ranges['end']-$ranges['start']));
-
- // 범위 제한
- header(sprintf('content-range:bytes %s-%s/%s', $ranges['start'], $ranges['end'], $ 파일_크기));
-
- // fp指针跳到断点位置
- fseek($fp, sprintf('%u', $ranges['start']));
- }else{
- header('HTTP/1.1 200 OK');
- header('content-length:'.$file_size);
- }
-
- while(!feof($fp)){
- echo fread($fp, round($this->_speed*1024,0));
- ob_flush();
- //수면(1); // 于测试,减慢下载速degree
- }
-
- ($fp!=null) && fclose($fp);
-
- }else{
- return '';
- }
- }
-
- /**다운로드 속도 설정
- * @param int $speed
- */
- 공개 함수 setSpeed($speed){
- if(is_numeric($speed) && $speed>16 && $ 속도<4096){
- $this->_speed = $speed;
- }
- }
-
- /**헤더 범위 정보 가져오기
- * @param int $file_size 파일 크기
- * @return Array
- */
- 비공개 함수 getRange($file_size){
- if(isset($_SERVER['HTTP_RANGE']) && ! 비어있음($_SERVER['HTTP_RANGE'])){
- $range = $_SERVER['HTTP_RANGE'];
- $range = preg_replace('/[s|,].*/', '', $range);
- $range =explod('-', substr($range, 6));
- if(count($range)<2){
- $range[1] = $file_size;
- }
- $range = array_combine(array('start','end'), $range);
- if(empty($range['start'])){
- $range['start'] = 0;
- }
- if(empty($range['end'])){
- $range['end'] = $file_size;
- }
- return $range;
- }
- null을 반환합니다.
- }
-
- } // 수업 종료
-
- ?>
复代码
2,演示示例 데모. PHP
-
- require('FileDownload.class.php');
- $file = 'book.zip';
- $name = 시간().'.zip';
- $obj = new FileDownload();
- $flag = $obj->download($file, $name);
- //$flag = $obj->download($file, $name, true); // 断点续传
-
- if(!$flag){
- echo '파일이 없습니다';
- }
-
- ?>
复代代码
断点续传测试방법:
使用linux wget命令去测试下载, wget -c -O 파일 http://xxx
1,先关闭断点续传
-
- $flag = $obj->download($file, $name);
复主代码
wget 명령을 사용하여 중단점 재개를 테스트합니다.
-
- root@jbxue:~/Downloads$ wget -O test.rar http://demo.fdipzone.com/demo.php
- -- 2013-06-30 16:52:44-- http://demo.fdipzone.com/demo.php
- 호스트 데모.fdipzone.com 확인 중... 127.0.0.1
- demo.fdipzone에 연결 중 . com|127.0.0.1|:80... 연결되었습니다.
- HTTP 요청이 전송되었으며 응답을 기다리는 중... 200 OK
- 길이: 10445120(10.0M) [application/octet-stream]
- 저장 위치: “test.rar”
- 30% [= ===========================> ] 3,146,580 513K/s 예상 시간 14초
- ^C
- root@jbxue :~/ 다운로드$ wget -c -O test.rar http://demo.fdipzone.com/demo.php
- --2013-06-30 16:52:57-- http://demo.fdipzone .com/ 데모.php
- 호스트 데모.fdipzone.com 확인 중... 127.0.0.1
- demo.fdipzone.com|127.0.0.1|:80 연결 중... 연결되었습니다.
- HTTP 요청이 전송되었으며 응답을 기다리는 중... 200 OK
- 길이: 10445120(10.0M) [application/octet-stream]
- 저장 위치: “test.rar”
- 30% [= ==========================> ] 3,146,580 515K/s 예상 시간 14초
- ^C
-
코드 복사
wget -c가 중단점에서 업로드를 재개할 수 없음을 알 수 있습니다.
2. 중단점 재개를 활성화합니다.
-
- $flag = $obj->download($file, $name, true);
코드 복사
wget 명령을 사용하여 재개 기능을 테스트합니다.
-
- root@jbxue:~/Downloads$ wget -O test.rar http://demo.fdipzone.com/demo.php
- -- 2013-06-30 16:53:19-- http://demo.fdipzone.com/demo.php
- 호스트 데모.fdipzone.com 확인 중... 127.0.0.1
- demo.fdipzone에 연결 중 . com|127.0.0.1|:80... 연결되었습니다.
- HTTP 요청이 전송되었으며 응답을 기다리는 중... 200 OK
- 길이: 10445120(10.0M) [application/octet-stream]
- 저장 위치: “test.rar”
-
- 20 % [==================> ] 2,097,720 516K/s 예상 시간 16초
- ^C
- root@jbxue:~/Downloads$ wget - c -O test.rar http://demo.fdipzone.com/demo.php
- --2013-06-30 16:53:31-- http://demo.fdipzone.com/demo.php
- 해결 중 호스트 데모.fdipzone.com... 127.0.0.1
- 연결 중 데모.fdipzone.com|127.0.0.1|:80... 연결되었습니다.
- HTTP 요청 전송됨, 응답 대기 중... 206 부분 콘텐츠
- 길이: 10445121(10.0M), 7822971(7.5M) 남은 바이트 [application/octet-stream]
- 저장 위치: "test. rar"
-
- 100%[ ===============================>] 10,445,121 543K /s 14초 소요
-
- 2013-06-30 16:53:45 (543 KB/s) - "test.rar" 저장됨 [10445121/10445121])
-
코드 복사
중단점 위치( )부터 다운로드가 시작되는 것을 확인할 수 있습니다.
PHP 파일 다운로드 클래스의 소스코드 다운로드 주소 첨부(브레이크포인트 이력서 다운로드 지원)
|