request对象获取文件出错【已解决】

doit

bug描述

表单上传文件,图片可选可不选,使用request对象获取所有图片时报错;报错信息如下:

程序代码或配置

$file = $request->file('img');

postman请求
截图

期待的结果及实际结果

按照手册应该返回null
实际报错信息为:
截图

重现bug的步骤

控制器中打印$request->file('img');
请求参数中包含file类型字段 img,img1,img未选择图片!

系统环境及workerman/webman等具体版本

截图

694 2 1
2个回答

liziyu

大佬说,这个不算bug的。

  • doit 2022-11-09

    很多场景表单中文件都是非必填项啊~

  • doit 2022-11-09

    手册上写的是,$request->file('avatar');如果文件存在的话则返回对应文件的webman\Http\UploadFile实例,否则返回null。

walkor

什么浏览器

  • doit 2022-11-09

    使用的Postman,form-data请求

  • walkor 2022-11-09

    这边浏览器测试和postman测试没出现你说的问题,
    截图下postman界面吧,看下参数是怎么传的

  • doit 2022-11-09

    已经修改问题,截图如上

  • walkor 2022-11-09

    从报错看是postman没传递content-type数据导致的,我这没复现这个问题,可能是我这postman版本和你的不一样。
    你先本地修改下vendor/workerman/workerman/Protocols/Http/Request.php ,将 parseUploadFile 方法里

    $file = [
        'name' => $match[2],
        'tmp_name' => $tmp_file,
        'size' => $size,
        'error' => $error,
        'type' => null,
    ];

    改成

    $file = [
        'name' => $match[2],
        'tmp_name' => $tmp_file,
        'size' => $size,
        'error' => $error,
        'type' => '', // 这里null改成''
    ];

    目前看这个问题可能只出现在某些版本的postman上,浏览器没有问题,这个将在下个workerman版本做兼容。

  • doit 2022-11-09

    调整后没有问题了,postman版本Version 9.24.2

  • doit 2022-11-09

    感谢大佬

年代过于久远,无法发表回答
🔝