php文件上传有四种方法:一、html表单配合$_files接收并move_uploaded_file移动;二、流方式读取php://input;三、ajax+formdata异步上传;四、自定义upload_tmp_dir临时目录。

如果您希望用户能够通过网页表单将文件发送到服务器,PHP提供了多种方式来接收和处理上传的文件。以下是实现PHP文件上传功能的具体方法:
一、使用HTML表单配合$_FILES全局变量接收文件
该方法基于PHP内置的文件上传机制,依赖于表单的enctype属性和$_FILES数组解析上传数据。PHP会自动将上传文件暂存至临时目录,并在脚本执行结束后清理,因此需在脚本中及时移动文件。
1、创建包含文件输入字段的HTML表单,设置method为POST且enctype为multipart/form-data。
2、在PHP脚本中检查$_FILES['file_input_name']['error']是否为UPLOAD_ERR_OK,确认无上传错误。
立即学习“PHP免费学习笔记(深入)”;
3、使用move_uploaded_file()函数将$_FILES['file_input_name']['tmp_name']指定的临时文件移至目标路径。
4、验证文件类型与大小:通过$_FILES['file_input_name']['size']获取字节数,通过pathinfo($_FILES['file_input_name']['name'], PATHINFO_EXTENSION)提取扩展名。
二、使用PHP流方式读取并保存上传文件
此方法绕过move_uploaded_file(),直接读取php://input流(适用于禁用文件上传或需要自定义处理逻辑的场景),但要求表单不使用multipart/form-data编码,仅适用于小文本类文件且需手动解析边界。
1、将HTML表单的enctype设为text/plain或application/octet-stream(注意:标准文件上传不推荐此方式)。
2、在PHP中调用file_get_contents('php://input')获取原始数据。
3、根据Content-Disposition头信息(需前端配合构造)或约定格式提取文件名与内容。
4、使用file_put_contents()将原始数据写入指定路径,注意需自行校验文件头与扩展名一致性,防止恶意伪装。
三、通过AJAX结合FormData对象上传并由PHP接收
该方法支持异步上传、进度监控及多文件并发,后端仍使用$_FILES接收,但前端以JavaScript构造请求,提升用户体验。
1、在HTML中添加元素。
2、使用JavaScript获取FileList对象,创建FormData实例并append每个文件项。
3、配置XMLHttpRequest或fetch发送POST请求,无需手动设置Content-Type,浏览器自动添加边界信息。
4、PHP端按常规方式访问$_FILES数组,确保php.ini中file_uploads=On且upload_max_filesize足够容纳目标文件。
四、启用PHP上传临时目录自定义与权限控制
默认情况下PHP将上传文件暂存于系统临时目录,修改该路径可增强隔离性与安全性,尤其适用于共享主机或多租户环境。
1、编辑php.ini,设置upload_tmp_dir为绝对路径,例如upload_tmp_dir = /var/tmp/php_uploads。
2、创建对应目录并赋予Web服务器用户(如www-data或apache)读写执行权限。
3、重启Web服务器使配置生效。
4、在PHP脚本中可通过sys_get_temp_dir()确认当前临时目录,禁止将upload_tmp_dir指向Web可访问路径,防止临时文件被直接下载。











