PHP 7.4 下载文件分两种:一是用 file_get_contents() 或 cURL 将远程文件保存至服务器本地,适用于小文件自动抓取;二是通过 header() 发送响应头使浏览器触发下载,实现用户端“另存为”。

PHP 7.4 下载文件到本地,核心是区分两种常见场景:一种是从远程 URL 把文件拉取并保存到服务器本地磁盘(比如下载图片、PDF、压缩包);另一种是让访问网页的用户把服务器上的文件“另存为”到自己电脑(即浏览器触发下载)。新手容易混淆这两者,下面按用途分开讲清楚。
从远程地址下载文件并保存到服务器本地
适合后台自动抓取资源,比如定时下载日志、备份文件、采集公开数据。推荐用 file_get_contents() 或 cURL,注意适用范围:
- 小文件(:代码最简,但会把整个文件加载进内存
示例:
$content = file_get_contents('https://example.com/data.zip');<br> file_put_contents('/var/www/html/downloads/data.zip', $content); -
大文件或需控制过程用 cURL:支持断点续传、超时设置、进度反馈,不占内存
示例:
$ch = curl_init('https://example.com/large.iso');<br> $fp = fopen('/tmp/large.iso', 'w');<br> curl_setopt($ch, CURLOPT_FILE, $fp);<br> curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);<br> curl_exec($ch);<br> curl_close($ch); fclose($fp);
让用户点击后把服务器文件下载到自己电脑
这是最常见的“前端下载”需求,比如简历下载、订单导出。关键不是传输文件,而是正确设置 HTTP 响应头 + 输出文件内容,让浏览器识别为可下载附件:
- 必须设置三个关键 header:
header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename="report.pdf"');header('Content-Length: ' . filesize($filepath)); - 然后用
readfile($filepath)直接输出(推荐),或fpassthru(fopen(...))流式输出
注意:确保$filepath是服务器上真实存在的绝对路径,且 PHP 有读取权限;不能是 URL(如http://...)
新手常踩的坑和提醒
刚上手容易卡在这几个地方:
立即学习“PHP免费学习笔记(深入)”;
-
报错 “headers already sent”:说明在
header()之前已有输出(空格、echo、BOM 字符、错误提示),检查 PHP 文件开头无空白,关闭display_errors或用输出缓冲ob_start() -
下载后文件打不开/损坏:可能是编码问题(尤其 Windows 编辑器保存带 BOM),或
Content-Length和实际大小不符,建议优先用readfile()自动处理 -
中文文件名乱码:浏览器兼容性差,简单方案是英文命名;进阶可用
rawurlencode()处理,但非必需 -
安全风险:如果文件路径来自用户输入(如
$_GET['file']),务必校验、白名单过滤或限定目录,防止路径遍历(../../../etc/passwd)



















