php多文件上传时$_files['photos']是二维数组,键为name/type/tmp_name/error/size,各键下才是文件列表;需用count($_files'photos')获数量,再for循环逐个检查error和tmp_name后移动。

PHP 多文件上传的 $_FILES 结构怎么读?
PHP 不会把多个同名文件合并成一个数组,而是按字段名自动组织成二维(甚至三维)结构——这点和单文件完全不同,也是绝大多数人卡住的第一步。
假设表单里是 <input type="file" name="photos[]" multiple>,那么 $_FILES['photos'] 是个关联数组,键为 name、type、tmp_name、error、size,每个键下才是实际的文件列表数组。
-
$_FILES['photos']['name'][0]是第一个文件名,[1]是第二个,以此类推 -
$_FILES['photos']['error'][0]必须为0才表示上传成功;非零值要查UPLOAD_ERR_*常量 - 如果用
name="avatar"(没加[]),即使 HTML 有multiple,PHP 也只保留最后一个文件
怎么安全地遍历并移动多个上传文件?
不能直接对 $_FILES['xxx']['tmp_name'] 调用 move_uploaded_file(),必须逐个索引处理,且每一步都要检查 error 和 tmp_name 是否合法。
常见错误:用 foreach($_FILES['photos'] as $file) —— 这会遍历 name、type 等键,不是文件项。
立即学习“PHP免费学习笔记(深入)”;
【极品模板】出品的一款功能强大、安全性高、调用简单、扩展灵活的响应式多语言企业网站管理系统。 产品主要功能如下: 01、支持多语言扩展(独立内容表,可一键复制中文版数据) 02、支持一键修改后台路径; 03、杜绝常见弱口令,内置多种参数过滤、有效防范常见XSS; 04、支持文件分片上传功能,实现大文件轻松上传; 05、支持一键获取微信公众号文章(保存文章的图片到本地服务器); 06、支持一键
- 先用
count($_FILES['photos']['name'])获取文件数量 - 用
for($i = 0; $i 循环,确保五个子数组(<code>name/tmp_name/…)索引对齐 - 每次循环前检查
$_FILES['photos']['error'][$i] === UPLOAD_ERR_OK,否则跳过或报错 -
move_uploaded_file()的第二个参数路径必须是绝对路径,相对路径容易失败
max_file_uploads 和 post_max_size 容易被忽略
即使代码写对了,上传超过 20 个文件默认就静默截断——这是 PHP 内置限制,不是你代码的问题。
max_file_uploads 控制单次请求最多允许几个文件上传(默认 20),而 post_max_size 和 upload_max_filesize 共同决定总数据量上限。
- 在
php.ini中调高:max_file_uploads = 50、post_max_size = 64M、upload_max_filesize = 16M - 修改后必须重启 PHP-FPM 或 Web 服务器,
phpinfo()查看生效值 - 如果用
.htaccess或ini_set(),部分配置(如max_file_uploads)无法运行时修改,只能靠php.ini
前端 multiple 和后端逻辑怎么对齐?
HTML 的 multiple 属性只是让浏览器允许多选,它不改变字段名规则;真正决定 PHP 如何解析的是 name 属性是否带 []。
如果前端用 name="files"(无方括号),后端收到的就是单文件结构,哪怕用户选了十个——最后一个覆盖前面所有。
- 必须写成
name="files[]",才能让 PHP 按数组组织 - JavaScript 动态添加 input 时,也要保证每个
<input type="file">的name是files[],而不是files[0]等手动索引 - 用 FormData 提交时,
append('files[]', file)中的files[]名字要和后端读取的$_FILES键一致
多文件上传真正的复杂点不在循环本身,而在错误分散:一个文件失败不该阻断其余文件处理,但又要分别记录失败原因;tmp_name 为空、error 非零、move_uploaded_file 返回 false,这三类情况得分开判断,漏掉任何一种都可能让上传“看起来成功”实则丢文件。










