要实现 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下载文件源代码(强制任意文件格式下载)


基础教程推荐
猜你喜欢
- php生成短网址/短链接原理和用法实例分析 2023-04-20
- php如何获取当前日期和星期 2024-12-06
- php去除deprecated的实例方法 2022-09-02
- Laravel修改验证提示信息为中文的示例 2023-03-08
- PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br 2024-03-28
- php+mysql开发的最简单在线题库(在线做题系统)完整案例 2023-01-04
- PHP采用get获取url汉字出现乱码的解决方法 2024-03-28
- PHP laravel使用自定义邮件类实现发送邮件 2023-07-03
- Laravel 解决composer相关操作提示php相关异常的问题 2023-03-08
- PHP基于反射机制实现自动依赖注入的方法详解 2022-10-02