下载文件
/**
* @description: 可用于ajax返回,也可直接下载
* @param {*} $file 文件地址
* @param {*} $name 下载的文件名
* @return {*}
*/
function ajax_return($file,$name = '')
{
$file_name = $name ?: pathinfo($file.PATHINFO_BASENAME);
$file_name = str_replace("+", "%20", urlencode($file_name));
// 可以指定文件类型下载文件
// $finfo = finfo_open(FILEINFO_MIME_TYPE);
// $mime = finfo_file($finfo, $file);
ob_end_clean();
header('Pragma:public');
header('Content-Type:application/octet-stream');
// header('Content-Type:'.$mime);
header('Content-Disposition:attachment; filename="'.$file_name.'"');
header('Content-Length:'.filesize($file));
header('Content-Transfer-Encoding:binary');
echo file_get_contents($file);
unlink($file);
}
输出文件
/**
* @description: 将文件直接展示在浏览器中
* @param {*} $file 文件地址
* @return {*}
*/
function show_brower($file)
{
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file);
ob_end_clean();
header('Pragma:public');
header('Content-Type:'.$mime);
header('Content-Disposition:inline;');
header('Content-Length:'.filesize($file));
header('Content-Transfer-Encoding:binary');
header('Expires:'.gmdate("D, d M Y H:i:s", time() + 7 * 86400 . ' GMT'));
echo file_get_contents($file);
}
下载pdf
/**
* @description: 下载pdf
* @param {*} $file 文件地址
* @param {*} $name 下载的文件名
* @return {*}
*/
function down_pdf($file,$name = '')
{
$file_name = $name ?: pathinfo($file.PATHINFO_BASENAME);
$file_name = str_replace("+", "%20", urlencode($file_name));
ob_clean();
header("Content-type: application/pdf");
header("Content-Disposition:attachment;filename=".$file_name);
header('Cache-Control: max-age=0');
readfile($file);
unlink($file);
}
下载中文名乱码问题
将中文名urlencode
$new_name = str_replace("+", "%20", urlencode($file_name));
下载大文件时文件损坏解决方法
遇到的问题:下载200M的文件时,下载的文件只有几kb,还不报错
原因:PHP内存有限制,需要改为按块下载,就是把大文件切块后逐块下载。
/**
* @description: 下载大文件
* @param {*} $file 文件地址
* @param {*} $name 下载的文件名
* @return {*}
*/
function down_big_file($file,$name)
{
//总的缓冲的字节数
$sum_buffer=0;
//针对大文件,规定每次读取文件的4096字节
$read_buffer = 4096;
$filesize = filesize($file);
$file_name = $name ?: pathinfo($file.PATHINFO_BASENAME);
$file_name = str_replace("+", "%20", urlencode($file_name));
header('Pragma: public');
header('Content-Type: application/octet-stream');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename='.$file_name);
header('Content-Transfer-Encoding: chunked');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Length:'.$filesize);
header('Expires: 0');
$handle = fopen($file, 'rb');
while(!feof($handle) && $sum_buffer < $filesize) { //文件未读取完时一直读取
echo fread($handle,$read_buffer);
$sum_buffer+=$read_buffer;
}
fclose($handle);
unlink($file);
exit();
}