You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多文件上传时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:28:09