要实现 PHP 下载文件的功能,有两种常见的方式:
要实现 PHP 下载文件的功能,有两种常见的方式:
- 通过设置 HTTP 响应头,让浏览器以下载文件的方式处理页面输出。
- 读取服务器端的文件内容,设置 HTTP 响应头,并输出文件内容。
下面是分别对应两种方式的完整攻略:
通过设置 HTTP 响应头
代码示例:
$file = 'example.png'; // 要下载的文件路径
$filename = 'newname.png'; // 下载时的文件名
// 清除缓冲区
ob_clean();
// 设置 HTTP 响应头
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($filename));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: '.filesize($file));
// 输出文件内容
readfile($file);
该示例中,我们通过设置 HTTP 响应头的方式告诉浏览器这个页面是一个下载文件,并指定了下载时的文件名、文件类型等相关信息,然后输出文件内容。
读取服务器端的文件内容
代码示例:
$file = 'example.pdf'; // 要下载的文件路径
$filename = 'newname.pdf'; // 下载时的文件名
// 打开文件,并读取内容
if ($handle = fopen($file, 'rb')) {
$contents = fread($handle, filesize($file));
fclose($handle);
}
// 设置 HTTP 响应头
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$filename);
// 输出文件内容
echo $contents;
该示例中,我们直接读取了服务器端的文件内容,然后设置了下载时的文件名和文件类型的 HTTP 响应头,并将文件内容输出给浏览器。
需要注意的是,上述方式在处理大文件时可能会出现性能问题。在实际开发中,如果需要下载大型文件,可以考虑使用分块传输方式,以避免服务器压力过大,同时提高下载速度。
例如:
$file = 'example.mp4'; // 要下载的文件路径
$filename = 'newname.mp4'; // 下载时的文件名
$chunksize = 1 * 1024 * 1024; // 每块大小,这里设置为 1MB
// 打开文件
if ($handle = fopen($file, 'rb')) {
// 计算文件大小和块数
$filesize = filesize($file);
$totalchunks = ceil($filesize / $chunksize);
// 设置 HTTP 响应头
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$filename);
// 逐块输出文件内容
for ($i=0; $i<$totalchunks; $i++) {
$start = $i * $chunksize;
$end = $start + $chunksize - 1;
if ($end > $filesize) {
$end = $filesize - 1;
}
// 输出数据块
fseek($handle, $start);
echo fread($handle, $end - $start + 1);
// 清空缓冲区,避免内存占用过大
ob_flush();
flush();
}
fclose($handle);
}
该示例中,我们通过分块逐个输出文件内容的方式减轻了服务器压力,保证了下载速度。
织梦狗教程
本文标题为:php下载文件源代码(强制任意文件格式下载)


基础教程推荐
猜你喜欢
- 使用ucenter实现多站点同步登录的讲解 2023-01-04
- php redis的scan用法实例分析 2022-09-12
- 关于laravel框架中的常用目录路径函数 2023-03-07
- php常见的网络攻击及防御方法 2023-06-03
- php array_walk 对数组中的每个元素应用用户自定义函数详解 2024-01-05
- php微信小程序解包过程实例详解 2023-06-03
- 详解PHP优化巨量关键词的匹配 2023-06-12
- PHP实现无限极分类的两种方式示例【递归和引用方式】 2023-01-04
- php命名空间设计思想、用法与缺点分析 2023-01-30
- PHP 计算两个时间段之间交集的天数示例 2023-03-08