Laravel测试文件上传时$request->file('file')返回null问题
错误原因
- 模拟文件被错误传入
route()辅助函数的路径参数数组中,没有作为POST请求的上传文件提交。
route()的第二个参数仅用于匹配路由定义中的路径占位符,不会被解析为请求上传文件。你当前的写法相当于把文件对象转成了路径参数的字符串值,自然无法通过$request->file()获取到UploadedFile实例,只能拿到文件名片段。
修正方法
调整测试请求的参数传值位置:路由路径参数放在route()的第二个参数中,POST请求的表单字段、上传文件统一作为$this->post()方法的第二个参数传入。
修正后的测试代码如下:
test('can upload file', function () { Storage::fake('local'); $file = UploadedFile::fake()->image('avatar.jpg'); // 无路径参数时route第二个参数传空数组,文件放到post方法的第二个参数位 $this->post( route('admin.ajax.files.store', []), ['file' => $file] ); // 控制器中补充对应的文件存储逻辑后即可通过断言,示例存储逻辑: // $request->file('file')->store('/'); Storage::disk('local')->assertExists($file->hashName()); });
如果目标路由本身带路径占位符,比如路由定义为admin/ajax/files/{group}/store,只需把路径占位符对应的参数放到route()的参数数组中即可,请求文件仍然放在post的第二个参数位,示例:
// 路由带路径参数的场景 $this->post( route('admin.ajax.files.store', ['group' => 'avatar']), ['file' => $file] );
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

