在 PHP 环境下,实现文件上传与下载功能的具体步骤和关键注意事项有哪些?
考察说明
考查对 PHP 文件上传与下载流程的掌握,包括配置、处理逻辑和安全性。
回答思路
- 【回答框架 1】文件上传:通过 HTTP POST 和 multipart/form-data 方式传输,PHP 将文件信息保存到超全局数组 $_FILES 中。核心配置项包括 upload_max_filesize 限制上传大小、post_max_size 限制 POST 数据总量、file_uploads 启用上传功能。临时文件存储于系统临时目录,脚本结束后自动删除,需使用 move_uploaded_file() 移动至持久位置。
- 【回答框架 2】上传处理需检查错误码,如 UPLOAD_ERR_OK 表示成功;使用 is_uploaded_file() 验证文件来源;通过 getimagesize() 或 finfo_file() 验证文件类型,防止伪造 MIME。文件名应重新生成,避免用户输入路径,并控制文件大小。
- 【回答框架 3】文件下载:通过设置响应头实现,如 Content-Type 指定 MIME 类型,Content-Disposition 设置 attachment 和 filename 提示保存。使用 readfile() 或 fpassthru() 输出文件内容,或使用流式分块读取避免内存溢出。需考虑大文件断点续传,支持 Range 请求头。
- 【回答框架 4】安全性:下载时需校验文件路径,防止目录穿越;对用户输入进行过滤,确保只下载授权文件。上传目录应禁止执行 PHP 脚本,如设置 .htaccess 或 Nginx 配置,防止上传恶意文件。
- 【回答框架 5】性能优化:对于大文件,使用流式读取而非一次性加载;考虑使用 chunked 传输或代理支持;记录上传下载日志,便于审计和排查问题。
- 【关键点 1】使用 move_uploaded_file() 移动临时文件,不能直接用 rename()。
- 【关键点 2】检查 $_FILES['file']['error'] 的值,UPLOAD_ERR_OK 表示成功。
- 【关键点 3】设置 Content-Disposition: attachment 强制下载,而不是内联显示。
- 【关键点 4】验证文件类型和大小,防止恶意文件上传。
- 【关键点 5】下载大文件时使用流式读取,如 fread() 循环或 readfile(),避免内存耗尽。
- 【易错点 1】忽略上传错误码,未检查 $_FILES 中的 error 字段,导致处理失败。
- 【易错点 2】使用用户提供的文件名直接拼接到路径,造成目录遍历漏洞。
- 【易错点 3】上传目录可执行 PHP 脚本,导致远程代码执行风险。