扫盲 2026.11.05 13:45 16 次浏览 0 条评论

PHP下载文件功能简单实现

PHP做下载不用什么框架,几个header加readfile就够。关键点:先设置响应头,再输出文件,中间不能有任何多余输出,否则文件会变乱码或者打不开。

<?php
$file = './files/test.zip'; // 文件真实路径
if (!file_exists($file)) {
    exit('文件不存在');
}
// 告诉浏览器这是下载流
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file) . '"'); // 弹出的文件名
header('Content-Length: ' . filesize($file)); // 文件大小,进度条靠它
readfile($file); // 一次性把文件吐出去
exit;

中文文件名在部分浏览器会乱码,用 rawurlencode 包一层再拼到 filename 里就行。

$name = rawurlencode(basename($file));
header("Content-Disposition: attachment; filename*=UTF-8''" . $name);

大文件别用readfile硬扛,容易吃满内存,改成fopen加fread按块读,边读边flush。

$fp = fopen($file, 'rb');
while (!feof($fp)) {
    echo fread($fp, 8192); // 每次读8KB
    flush();
}
fclose($fp);

还有几个坑:文件前面不能有BOM和空行,session_start之后别输出;下载目录权限要给读权限,但别放到网站根下随便能被直接访问的位置。

标签:PHP,文件下载,后端开发

说点什么 0

行思随记

欢迎来到:行思随记