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 ~ ~ ~');
}
}
宠物免费领养小程序,欢迎来踩