PHP封装的一个完善的下载方法,包括本地文件及网络文件的下载,本地文件支持分流。 /** * 阿炳个性下载方法 (欢迎指出BUG或交流更完美的方法) * Developer: Mr.Li , QQ:1691285988 2018.08.08 * @param url 网络文件URL 本站或远程、云端文件等。 * @return 输出文件流 */ public function download($file_path,$file_tmp_name='') { $suffix = pathinfo($file_path,PATHINFO_EXTENSION); $suffix = $suffix ?'.'.$suffix:strrchr($file_path,'.'); if(!$file_tmp_name) {// 个性文件名 $file_tmp_name = 'ABingFileDownload_'.date('Ymd'); } $file_tmp_name .= $suffix; if(preg_match("/[\x7f-\xff]/",$file_path)) {// 避免中文检测不到,进行转码utf-8->gbk $file_path = iconv('utf-8', 'gb2312',$file_path); } if($file_path && file_exists($file_path)) {// 本地文件下载 支持分流 //文件大小 $file_size = filesize ($file_path); //打开文件 $file_content = fopen ($file_path, "r" ); //返回的文件(流形式) Header ( "Content-type: application/octet-stream" ); //按照字节大小返回 Header ( "Accept-Ranges: bytes" ); //返回文件大小 Header ( "Accept-Length: " . $file_size ); //客户端弹出对话框,对应的文件名 Header ( "Content-Disposition: attachment; filename=".$file_tmp_name); //输出文件内容进行下载 if( $file_size>1048576 ) { // 缓存区处理 ob_clean(); flush(); //设置分流字节 $buffer = 1048576; // 1024 * 1024 //文件传输字节计数 $count = 0; // 分流计算 while( !feof($file_content) && ($file_size-$count > 0) ) { $count += $buffer;//增加计数 // 传输数据到浏览器端 echo fread( $file_content, $buffer ); } } else { //传输数据到浏览器端 echo fread ( $file_content, $file_size ); } fclose ( $file_content ); exit(); } else if($file_path && @file_get_contents($file_path, null, null, -1, 1)!==false) {// 网络文件下载 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.$file_tmp_name); header('Content-Transfer-Encoding: binary'); readfile($file_path); exit(); } else {// 不支持的下载 header("HTTP/1.1 404 Not Found"); exit('G D Z ~ ~ ~'); } }
宠物免费领养小程序,欢迎来踩