本文实例讲述了PHP实现下载断点续传的方法。分享给大家供大家参考。
具体实现代码如下:
<?php <br />/*<br /> * PHP下载断点续传<br /> */<br />function dl_file_resume($file){ <br /> <br /> //检测文件是否存在 <br /> if (!is_file($file)) { die("<b>404 File not found!</b>"); } <br /> <br /> $len = filesize($file);//获取文件大小 <br /> $filename = basename($file);//获取文件名字 <br /> $file_extension = strtolower(substr(strrchr($filename,"."),1));//获取文件扩展名 <br /> <br /> //根据扩展名 指出输出浏览器格式 <br /> switch( $file_extension ) { <br /> case "exe": $ctype="application/octet-stream"; break; <br /> case "zip": $ctype="application/zip"; break; <br /> case "mp3": $ctype="audio/mpeg"; break; <br /> case "mpg":$ctype="video/mpeg"; break; <br /> case "avi": $ctype="video/x-msvideo"; break; <br /> default: $ctype="application/force-download"; <br /> } <br /> <br /> //Begin writing headers <br /> header("Cache-Control:"); <br /> header("Cache-Control: public"); <br /> <br /> //设置输出浏览器格式 <br /> header("Content-Type: $ctype"); <br /> if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {//如果是IE浏览器 <br /> # workaround for IE filename bug with multiple periods / multiple dots in filename <br /> # that adds square brackets to filename - eg. setup.abc.exe becomes setup[1].abc.exe <br /> $iefilename = preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1); <br /> header("Content-Disposition: attachment; filename=\"$iefilename\""); <br /> } else { <br /> header("Content-Disposition: attachment; filename=\"$filename\""); <br /> } <br /> header("Accept-Ranges: bytes"); <br /> <br /> $size=filesize($file); <br /> //如果有$_SERVER['HTTP_RANGE']参数 <br /> if(isset($_SERVER['HTTP<p style="color:transparent">本文来源gao!%daima.com搞$代*!码$网3</p><strong>搞代gaodaima码</strong>_RANGE'])) { <br />/* --------------------------- <br /> Range头域 Range头域可以请求实体的一个或者多个子范围。例如, 表示头500个字节:bytes=0-499 表示第二个500字节:bytes=500-999 表示最后500个字节:bytes=-500 表示500字节以后的范围:bytes=500- 第一个和最后一个字节:bytes=0-0,-1 同时指定几个范围:bytes=500-600,601-999 但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。 <br /> ---------------------------*/<br /> <br />// 断点后再次连接 $_SERVER['HTTP_RANGE'] 的值 bytes=4390912- <br /> <br /> list($a, $range)=explode("=",$_SERVER['HTTP_RANGE']); <br /> //if yes, download missing part <br /> str_replace($range, "-", $range);//这句干什么的呢。。。。 <br /> $size2=$size-1;//文件总字节数 <br /> $new_length=$size2-$range;//获取下次下载的长度 <br /> header("HTTP/1.1 206 Partial Content"); <br /> header("Content-Length: $new_length");//输入总长 <br /> header("Content-Range: bytes $range$size2/$size");//Content-Range: bytes 4908618-4988927/4988928 95%的时候 <br /> } else {//第一次连接 <br /> $size2=$size-1; <br /> header("Content-Range: bytes 0-$size2/$size"); //Content-Range: bytes 0-4988927/4988928 <br /> header("Content-Length: ".$size);//输出总长 <br /> } <br /> //打开文件 <br /> $fp=fopen("$file","rb"); <br /> //设置指针位置 <br /> fseek($fp,$range); <br /> //虚幻输出 <br /> while(!feof($fp)){ <br /> //设置文件最长执行时间 <br /> set_time_limit(0); <br /> print(fread($fp,1024*8));//输出文件 <br /> flush();//输出缓冲 <br /> ob_flush(); <br /> } <br /> fclose($fp); <br /> exit; <br />} <br /> <br />dl_file_resume("1.zip");//同级目录的1.zip 文件 <br /> <br />//---------------------------------------<br /> <br />//不支持断点续传的文件下载。 <br /> <br />//---------------------------------------<br /> <br />downFile("1.zip"); <br /> <br />function downFile($sFilePath) <br />{ <br /> if(file_exists($sFilePath)){ <br /> $aFilePath=explode("/",str_replace("\\","/",$sFilePath),$sFilePath); <br /> $sFileName=$aFilePath[count($aFilePath)-1]; <br /> $nFileSize=filesize ($sFilePath); <br /> header ("Content-Disposition: attachment; filename=" . $sFileName); <br /> header ("Content-Length: " . $nFileSize); <br /> header ("Content-type: application/octet-stream"); <br /> readfile($sFilePath); <br /> } <br /> else<br /> { <br /> echo("文件不存在!"); <br /> } <br />} <br />?>
希望本文所述对大家的PHP程序设计有所帮助。