您好,欢迎访问一九零五行业门户网

PHP下载断点续传

php代码
/* * php下载断点续传 */ function dl_file_resume($file){ //检测文件是否存在 if (!is_file($file)) { die("<b>404 file not found!</b>"); } $len = filesize($file);//获取文件大小 $filename = basename($file);//获取文件名字 $file_extension = strtolower(substr(strrchr($filename,"."),1));//获取文件扩展名 //根据扩展名 指出输出浏览器格式 switch( $file_extension ) { case "exe": $ctype="application/octet-stream"; break; case "zip": $ctype="application/zip"; break; case "mp3": $ctype="audio/mpeg"; break; case "mpg":$ctype="video/mpeg"; break; case "avi": $ctype="video/x-msvideo"; break; default: $ctype="application/force-download"; } //begin writing headers header("cache-control:"); header("cache-control: public"); //设置输出浏览器格式 header("content-type: $ctype"); if (strstr($_server['http_user_agent'], "msie")) {//如果是ie浏览器 # workaround for ie filename bug with multiple periods / multiple dots in filename # that adds square brackets to filename - eg. setup.abc.exe becomes setup[1].abc.exe $iefilename = preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1); header("content-disposition: attachment; filename=\"$iefilename\""); } else { header("content-disposition: attachment; filename=\"$filename\""); } header("accept-ranges: bytes"); $size=filesize($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=0-0,-1 同时指定几个范围:bytes=500-600,601-999 但是 服务器可以忽略此请求头,如果无条件get包含range请求头,响应会以状态码206(partialcontent)返回而不是以 200 (ok)。 ---------------------------*/ // 断点后再次连接 $_server['http_range'] 的值 bytes=4390912- list($a, $range)=explode("=",$_server['http_range']); //if yes, download missing part str_replace($range, "-", $range);//这句干什么的呢。。。。 $size2=$size-1;//文件总字节数 $new_length=$size2-$range;//获取下次下载的长度 header("http/1.1 206 partial content"); header("content-length: $new_length");//输入总长 header("content-range: bytes $range$size2/$size"); //content-range: bytes 4908618-4988927/4988928 95%的时候 } else {//第一次连接 $size2=$size-1; header("content-range: bytes 0-$size2/$size"); //content-range: bytes 0-4988927/4988928 header("content-length: ".$size);//输出总长 } //打开文件 $fp=fopen("$file","rb"); //设置指针位置 fseek($fp,$range); //虚幻输出 while(!feof($fp)){ //设置文件最长执行时间 set_time_limit(0); print(fread($fp,1024*8));//输出文件 flush();//输出缓冲 ob_flush(); } fclose($fp); exit; } dl_file_resume("aa.zip");//同级目录的1.zip 文件
其它类似信息

推荐信息