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