多文件上传时is_uploaded_file()始终返回FALSE问题求助
解决多文件上传时
is_uploaded_file()返回FALSE的问题 嘿,我太懂这种明明能看到$_FILES数据却卡在上传验证的糟心情况了!结合你描述的场景,我帮你梳理几个最可能的原因和对应的解决办法:
1. 没处理好多文件上传的数组结构
多文件上传时,$_FILES['shopImage']['tmp_name']是一个数组,而不是单个字符串!如果你的HTML用的是<input type="file" name="shopImage[]" multiple>,直接把整个数组传给is_uploaded_file()肯定会返回false——这个函数只认单个临时文件路径。
正确的姿势是遍历每个文件:
foreach ($_FILES['shopImage']['tmp_name'] as $index => $tmpPath) { // 先跳过空的临时路径(比如用户没选满多个文件的情况) if (empty($tmpPath)) continue; if (is_uploaded_file($tmpPath)) { // 这里处理你的上传逻辑 echo "第{$index+1}个文件验证通过"; } else { echo "第{$index+1}个文件验证失败"; } }
2. 表单漏掉了enctype="multipart/form-data"
这是文件上传的入门级要求!如果你的form标签没加这个属性,浏览器根本不会把文件数据发送给服务器——哪怕var_dump($_FILES)能看到一些空字段,但实际临时文件根本没生成。
你的HTML表单必须写成这样:
<form method="POST" action="upload.php" enctype="multipart/form-data"> <input type="file" name="shopImage[]" multiple> <button type="submit">上传文件</button> </form>
你提到代码截断了,先优先检查这个属性有没有加,90%的新手都会在这里栽跟头。
3. 临时文件路径被篡改或权限不足
- 如果你的代码在调用
is_uploaded_file()之前,对tmp_name做了拼接、替换之类的操作,很可能破坏了原本的临时路径,导致函数无法识别这是PHP生成的上传临时文件。 - 另外,服务器的
upload_tmp_dir目录权限不够,PHP没法写入临时文件。可以通过phpinfo()查看这个目录的路径,确保PHP进程对它有读写权限。
4. 文件大小超出了PHP限制
如果上传的文件超过了php.ini里的upload_max_filesize或post_max_size设置,PHP会直接丢弃这个文件,此时tmp_name会是空字符串,is_uploaded_file()自然返回false。
你可以通过打印错误码快速排查:
var_dump($_FILES['shopImage']['error']);
对应的错误码含义:
- 1:超过
upload_max_filesize限制 - 2:超过表单里
MAX_FILE_SIZE隐藏域的限制 - 3:文件只上传了一部分
- 4:用户没选择任何文件上传
内容的提问来源于stack exchange,提问作者Tormy Van Cool
相关产品推荐
相关产品推荐

