tp5关于Linux单个表单上传多个文件出错问题

修复Request->file()判断临时文件不严谨导致多文件上传失败的情况

html文件
<form action="a.php" method="post" enctype="multipart/form-data">
    <input type="text" name="val" value="val"><br />
    <input type="file" name="logo"><br />
    <input type="file" name="video"><br />
    <button>按钮</button>
</form>

a.php
```
$file = $request->file('logo');var_dump($file);
            if (!empty($file)) {
                // 移动到框架应用根目录/public/uploads/ 目录下
                $info = $file->validate(['ext' => 'jpg,png'])->move(ROOT_PATH . 'public' . DS . 'uploads');

                if ($info) {
                    // $this->success('文件上传成功:' . $info->getRealPath());
                    $data['logo'] = str_replace('\\', '/', $info->getSaveName());
                    echo '<br />'.$info->getRealPath(). '<br />';
                } else {
                    // 上传失败获取错误信息
                    $this->error($file->getError());
                }
            }

            $file2 = $request->file('video');var_dump($file2);
            if (!empty($file2)) {
                // 移动到框架应用根目录/public/uploads/ 目录下
                $info2 = $file2->validate(['ext' => 'mp4'])->move(ROOT_PATH . 'public' . DS . 'uploads');

                if ($info2) {
                    // $this->success('文件上传成功:' . $info2->getRealPath());
                    $data['video'] = str_replace('\\', '/', $info2->getSaveName());
                    echo $info2->getRealPath();
                } else {
                    // 上传失败获取错误信息
                    $this->error($file2->getError());
                }
            }
```
这样的多文件上传代码会报错:
```
SplFileObject::__construct(/tmp/phpUlOxHg): failed to open stream: No such file or directory
```
但是在我的Windows本地环境下没有问题,linux上php5.6下出现上面的报错

通过调试,排查我发现了原因:原来linux下,文件上传后被“移走”了,临时文件就删除了,而Windows下还存在,所以本地成功,服务器上失败了。

其实这个问题很容易避免,这个问题是因为Request.php 中 file()方法判断临时文件不严谨导致的,从而将被移走的临时文件又传给了 (new File($file['tmp_name']))->setUploadInfo($file) 所以报错了。

补充:我没有使用官方img[]多文件上传的形式,因为项目中使用的是多字段,多文件上传的形式。

**其实可以总结下,文件上传分为:**
- 单文件上传
 - 单一字段
- 多文件上传
 - 多字段的形式多文件
 - 单一字段数组(img[])的形式多文件上传
 - 组合多文件(上面几种情况的组合)

修复如下:

文章内容为转载内容,原文链接https://github.com/top-think/framework/pull/348/commits/926ae650f11838d398a4afbf8bbcfd399e9bcadd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值