PHP实现文件下载两种方式(a标签和header标签)
文件的下载
1.标签a直接下载
<a href="/uploads/123465.docx" download="">download</a>
2.采用Header方式下载
<?php
ob_end_clean();
$file_name = "3.pdf"; //下载文件名
$file_dir = "./uploads/"; //下载文件存放目录
$file=$file_dir.$file_name;
//检查文件是否存在于目录
if (!file_exists ($file)) {
header('HTTP/1.1 404 NOT FOUND');
} else {
ob_end_clean();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
//请求范围的度量单位
Header ( "Accept-Ranges: bytes" );
//下载后的文件名称为$file_name
header('Content-Disposition: attachment; filename='.$file_name);
header('Content-Transfer-Encoding: binary');
#Expires:设置页面缓存时间
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: no cache');
//Content-Length是指定包含于请求或响应中数据的字节长度
header('Content-Length: ' . filesize($file));
ob_clean(); flush();
readfile($file);
exit();ob_end_clean();
}
1. 下载文件对话框
<?php
// 输出 PDF 文件
header('Content-type: application/octet-stream');
// 供一个推荐的文件名名称为 $file_name文件
header('Content-Disposition: attachment; filename='.$file_name);
// 该 PDF 来源于$file_name
readfile($file_name);
?>
2. 缓存指令
PHP 脚本经常生成一些动态内容,它不该被客户端、服务器与浏览器之间的代理缓存,通过以下指令控制缓存。
<?php
//设置缓存时间
header('Expires: 0');
header('Cache-Control: must-revalidate');
?>
cache-control可取值:
-
no-cache
: 告诉浏览器、缓存服务器,不管本地副本是否过期,使用资源副本前,一定要到源服务器进行副本有效性校验。 -
must-revalidate
:告诉浏览器、缓存服务器,本地副本过期前,可以使用本地副本;本地副本一旦过期,必须去源服务器进行有效性校验。
3. 清除缓存
如果不清楚缓存,在读取含图片的文件时,容易出现乱码等问题
- ob_end_clean();
- ob_clean(); flush();