背景:
当开发php网站时、实现下载功能时,陆陆续续碰到一些问题,如:
- 隐藏真实地址
- 路径或文件名含中文时,程序找不到文件
- 文件大小超过2G时,浏览器下载时显示的文件大小为0;
上述问题,本人是陆续发现,并在网上查询了一些文档,尚没有找到比较好的综合解决办法。于是这里做一个简单总结,供参考。
以下提供最终解决方案,并在注释中做给出一些必要的解释
/**
* @param $filename 文件全名(含路径):如"1.txt"、"C:/test/1.txt"、"./1.txt"、"../1.txt";
* @param $title 客户端显示的文件名,可不传值
*/
function download($filename, $title = null)
{
//实现对中文路径的支持
$filename = iconv("UTF-8", "GBK", $filename);
$filename = realpath($filename);
if (!file_exists($filename)) {
exit("文件不存在");
}
//实现对自定义文件名(客户浏览器显示的文件名)的支持
$title = $title == null ? basename($filename) : $title;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$title);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
//filesize($filename)不能支持2G以上超大文件的大小判断(会得到负值)
//综合网友的方法,采用sprintf("%u",filesize($filename))获取文件大小
header('Content-Length: ' . sprintf("%u",filesize($filename)));
ob_clean();
flush();
readfile($filename);
exit;
}