이 기사의 예에서는 PHP가 다운로드 중단점 재개를 구현하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요.
구체적인 구현 코드는 다음과 같습니다.
/*
* PHP 다운로드 중단점 재개
*/
함수 dl_file_resume($file){
//파일이 존재하는지 확인
If (!is_file($file)) { die("404 파일을 찾을 수 없습니다!") }
$len = filesize($file);//파일 크기 가져오기
$filename = basename($file);//파일 이름 가져오기
$file_extension = strtolower(substr(strrchr($filename,"."),1));//파일 확장자 가져오기
//확장자를 기반으로 출력 브라우저 형식을 나타냅니다.
스위치( $file_extension ) {
케이스 "exe": $ctype="application/octet-stream"
케이스 "zip": $ctype="application/zip"
케이스 "mp3": $ctype="audio/mpeg"
케이스 "mpg":$ctype="video/mpeg"
케이스 "avi": $ctype="video/x-msvideo"
기본값: $ctype="application/force-download"
}
//헤더 쓰기 시작
header("캐시 제어:");
header("캐시 제어: 공개")
//출력 브라우저 형식 설정
header("콘텐츠 유형: $ctype")
If (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {//IE 브라우저인 경우
# 파일 이름에 마침표/점이 여러 개 있는 IE 파일 이름 버그에 대한 해결 방법
# 파일 이름에 대괄호를 추가합니다. 예: setup.abc.exe는 setup[1].abc.exe가 됩니다.
$iefilename = preg_replace('/./', '.', $filename, substr_count($filename, '.') - 1);
header("콘텐츠 처리: 첨부 파일 이름="$iefilename"");
} 다른 {
header("콘텐츠 처리: 첨부 파일 이름="$filename"");
}
header("허용 범위: 바이트")
$size=파일 크기($file)
//$_SERVER['HTTP_RANGE'] 매개변수가 있는 경우
If(isset($_SERVER['HTTP_RANGE'])) {
/* -------------
Range 헤더 필드 Range 헤더 필드는 엔터티의 하나 이상의 하위 범위를 요청할 수 있습니다. 예를 들어, 처음 500바이트를 나타냅니다. bytes=0-499는 두 번째 500바이트를 나타냅니다. bytes=500-999는 마지막 500바이트를 나타냅니다. bytes=-500은 500바이트 이후의 범위를 나타냅니다. bytes=500- 첫 번째와 마지막 bytes: bytes=0-0,-1 동시에 여러 범위 지정: bytes=500-600,601-999 그러나 서버는 이 요청 헤더를 무시할 수 있습니다. 무조건 GET에 Range 요청 헤더가 포함되어 있으면 응답은 상태가 됩니다. 200(OK) 대신 코드 206(PartialContent)이 반환됩니다.
------------*/
// $_SERVER['HTTP_RANGE'] bytes=4390912-
값 이후에 다시 연결합니다.
list($a, $range)=explode("=",$_SERVER['HTTP_RANGE'])
//그렇다면 누락된 부분을 다운로드하세요
str_replace($range, "-", $range);//이 문장은 무엇을 위한 것인가요? . . .
$size2=$size-1;//파일의 총 바이트 수
$new_length=$size2-$range;//다음 다운로드 길이 가져오기
header("HTTP/1.1 206 부분 콘텐츠");
header("Content-Length: $new_length");//전체 길이 입력
header("Content-Range: bytes $range$size2/$size");//Content-Range: bytes 4908618-4988927/4988928 95%의 시간
} else {//첫 번째 연결
$size2=$size-1
header("콘텐츠 범위: 바이트 0-$size2/$size"); //콘텐츠 범위: 바이트 0-4988927/4988928
header("Content-Length: ".$size);//전체 길이 출력
}
//파일 열기
$fp=fopen("$file","rb")
//포인터 위치 설정
fseek($fp,$range)
//언리얼 출력
동안(!feof($fp)){
//최대 파일 실행 시간 설정
set_time_limit(0)
print(fread($fp,1024*8));//출력 파일
flush();//출력 버퍼
ob_flush()
}
fclose($fp)
종료
}
dl_file_resume("1.zip");//1.zip 파일을 같은 디렉토리에
//---------------------
//중단점에서 재개할 수 있는 파일 다운로드는 지원되지 않습니다.
//---------------------
downFile("1.zip")
함수 downFile($sFilePath)
{
If(파일_존재($sFilePath)){
$aFilePath=explode("/",str_replace("\","/",$sFilePath),$sFilePath)
$sFileName=$aFilePath[count($aFilePath)-1]
$nFileSize=파일 크기($sFilePath)
헤더("Content-Disposition: attachment; filename=" . $sFileName);
헤더("콘텐츠 길이: " . $nFileSize
헤더("콘텐츠 유형: 애플리케이션/옥텟-스트림")
readfile($sFilePath)
}
그 외
{
echo("파일이 존재하지 않습니다!");
}
}
?>
이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.