이 기사의 예에서는 중단점 이력서 다운로드를 지원하는 PHP로 구현된 파일 다운로드 클래스와 그 사용법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 방법은 다음과 같습니다.
일반적으로 PHP는 주로 HTTP 프로토콜의 HTTP_RANGE 헤더에 의존하여 중단점 재개를 지원합니다.
HTTP 중단점 재개 원칙:
Http 헤더 Range, Content-Range() HTTP 헤더에서 Range 및 Content-Range 엔터티 헤더는 일반적으로 중단점 다운로드에 사용됩니다. Range 사용자 요청 헤더에서 첫 번째 바이트 위치를 지정합니다. (Range: 200-300) Content-Range는 응답 헤더에 사용됩니다
전체 파일 다운로드 요청:
GET /test.rar HTTP/1.1 연결: close 호스트: 116.1.219.219 범위: bytes=0-801 //전체 파일을 다운로드하기 위한 일반 요청은 bytes=0- 또는 이 헤드를 사용하지 마세요
일반 응답:
HTTP/1.1 200 OK Content-Length: 801 Content-Type: application/octet-stream Content-Range: 바이트 0-800/801 //801: 총 파일 크기
FileDownload.class.php 클래스 파일 코드는 다음과 같습니다.
- /**
- * 다운로드 클래스, 중단점 이력서 다운로드 지원
- * @time: 2015 06 30 09:36
- * @author:guoyu@xzdkiosk.com
- * PHP 다운로드 클래스, 중단점 이력서 다운로드 지원
- * Func:
- * download: 파일 다운로드
- * setSpeed: 다운로드 속도 설정
- * getRange: 헤더의 범위 가져오기
- */
-
- class FileDownload{ // 클래스 시작
-
- private $_speed = 512; // 다운로드 속도
-
- /**Download
- * @param String $file 다운로드할 파일 경로
- * @param String $name 파일명, 비어 있으면 다운로드한 파일명과 동일
- * @param boolean $reload 중단점 연속 통과 활성화 여부
- */
- public 함수 download($file, $name =' ', $reload=false){
- if(file_exists($file)){
- if($name==''){
- $name = basename($file)
- }
-
- $fp = fopen($file, 'rb')
- $file_size = filesize($file)
- $ranges = $this->getRange($file_size); 🎜>
- header('cache-control:public');
- header('content-type:application/octet-stream')
- header('content-disposition:attachment; filename='. $name );
-
- if($reload && $ranges!=null){ // 재개
- 헤더('HTTP/1.1 206 부분 콘텐츠')
- header('Accept-Ranges : bytes');
-
- // 남은 길이
- header(sprintf('content-length:%u',$ranges['end']-$ranges['start']))
-
- // 범위 정보
- header(sprintf('content-range:bytes %s-%s/%s', $ranges['start'], $ranges['end'], $file_size ) ); // 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()
- //sleep(1) // 테스트용으로 사용, 다운로드 속도 저하 속도
- }
-
- ($fp!=null) && fclose($fp)
-
- }else{
- return ''; 🎜>
- /**다운로드 속도 설정
- * @param int $speed
- */
- 공개 함수 setSpeed($speed){
- if(is_numeric($speed) && $speed>16 && $speed<4096){
- $ this- >_speed = $speed;
- }
- }
-
- /**헤더 범위 정보 가져오기
- * @param int $file_size 파일 크기
- * @return Array
- */
- 비공개 함수 getRange($file_size){
- if(isset($ _SERVER[ 'HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])){
- $range = $_SERVER['HTTP_RANGE']
- $range = preg_replace('/[s|,] .* /', '', $range)
- $range =explosion('-', 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;
- }
- return null
- }
- } // 클래스 종료
-
- 코드 복사
데모 코드는 다음과 같습니다. - require('FileDownload.class.php')
- $file = 'book.zip ';
- $name = time().'.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)
test@ubuntu:~/Downloads$ wget -O test.rar http://demo.test.com/demo.php --2013-06 -30 16:52:44-- http://demo.test.com/demo.php 호스트 데모.test.com 확인 중... 127.0.0.1 - 데모.test.com에 연결 중| .0.1|:80... 연결되었습니다.
- HTTP 요청 전송됨, 응답 대기 중... 200 OK
- 길이: 10445120(10.0M) [application/octet-stream]
- 저장 위치: “test.rar”
-
- 30 % [==========================> ] 3,146,580 513K/s 예상 시간 14초
- ^C
- test@ubuntu :~/Downloads$ wget -c -O test.rar http://demo.test.com/demo.php
- --2013-06-30 16:52:57-- http://demone.test .com/demo.php
- 호스트 데모.test.com 확인 중... 127.0.0.1
- 연결 중 데모.test.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)
test@ubuntu:~/Downloads$ wget -O test.rar http://demo.test.com/demo.php --2013-06 -30 16:53:19-- http://demo.test.com/demo.php 호스트 데모.test.com 확인 중... 127.0.0.1 - 데모.test.com에 연결 중| .0.1|:80... 연결되었습니다.
- HTTP 요청 전송됨, 응답 대기 중... 200 OK
- 길이: 10445120(10.0M) [application/octet-stream]
- 저장 위치: “test.rar”
-
- 20 % [==================> ] 2,097,720 516K/s 예상 시간 16초
- ^C
- test@ubuntu:~/Downloads$ wget - c -O test.rar http://demo.test.com/demo.php
- --2013-06-30 16:53:31-- http://demo.test.com/demo.php
- 해결 중 호스트 데모.test.com... 127.0.0.1
- 연결 중 데모.test.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 14s
-
- 2013-06-30 16:53:45 (543 KB/s) - "test.rar" 저장됨 [10445121/10445121])
-
-
- 코드 복사
중단점 위치( )부터 다운로드가 시작되는 것을 확인할 수 있습니다.
출처: http://blog.csdn.net/phpfenghuo/article/details/46691865
|
중단점, PHP에서 업로드 재개