Lumen框架$request->file等方法返回空但$_FILES正常如何解决
问题引发原因
- Lumen框架为了实现极致轻量化,默认没有全局加载请求参数、文件解析相关中间件。
Illuminate\Http\Request实例只有经过对应中间件处理后,才会把PHP原生$_POST、$_FILES等超全局变量的内容同步到对象属性中,所以直接调用$request->all()、$request->allFiles()会返回空,而原生超全局变量不受影响。 - 你已经确认Postman配置、请求方法、PHP配置、Request引入都无误,所以无需校验自定义Content-Type、上传大小限制等低概率问题。
解决方案
方案1:注册全局中间件(推荐)
在项目根目录的bootstrap/app.php文件中修改中间件配置:
- 确认已开启门面支持,存在以下代码,没有则新增:
$app->withFacades();
- 注册表单和文件解析相关中间件,在中间件注册段添加如下配置:
$app->middleware([ // 原有其他全局中间件直接保留即可 \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \App\Http\Middleware\TrimStrings::class, // Lumen 8及以上版本需额外添加下面这行解析multipart请求 \Illuminate\Http\Middleware\ParseMultipartFormData::class, ]);
- 如果你的版本有默认
web中间件组,也可以直接给路由绑定中间件组:
$router->group(['middleware' => 'web'], function ($router) { $router->post('/import/create', 'CalendarController@importCreate'); });
方案2:手动同步请求数据(临时快速验证)
如果不想修改全局配置,可以直接在控制器方法开头手动同步原生超全局变量到Request实例:
public function importCreate(Request $request) { // 手动同步原生数据到Request对象 $request->initialize( $_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER ); $files = $request->allFiles(); return response($files); }
验证
修改后重新发起请求,$request->allFiles()和$request->all()即可正常返回对应数据。
内容的提问来源于stack exchange,提问作者slawkens
相关产品推荐
相关产品推荐

