Laravel5.8通过ajax上传文件时dd($request->all())返回空数组问题
问题原因排查&修复方案
核心错误
你当前AJAX配置使用GET请求提交文件,GET请求本身不支持传输二进制文件流和FormData对象,所有提交的参数会被直接丢弃,这是控制器获取不到参数的最主要原因。
完整修复步骤
- 修改AJAX请求类型为
POST
原AJAX配置里的type:"get"改为type:"post",修改后的JS代码如下:
$('#inputfile').on('change',function(ev){ ev.preventDefault(); var postData=new FormData(); postData.append('file',this.files[0]); $.ajax({ url:'{{url('reporting/uploadFile')}}', headers:{'X-CSRF-Token':$('meta[name=csrf_token]').attr('content')}, type:"post", // 此处修改为POST请求 contentType:false, data:postData, processData:false, // 调试阶段可以先注释掉dataType,避免非JSON返回触发error回调 // dataType:'json', success: function( data ) { console.log(data) }, error: function() { alert('error'); } }); });- 修改AJAX请求类型为
- 确认路由配置为POST类型
到routes/web.php中检查上传路由,必须使用Route::post注册:
Route::post('reporting/uploadFile', [你的控制器类名::class, 'uploadFile']);- 确认路由配置为POST类型
- 确认Blade模板头部存在CSRF元标签
模板<head>区域需要添加如下代码,否则Laravel的CSRF校验会拦截请求:
<meta name="csrf_token" content="{{ csrf_token() }}">- 确认Blade模板头部存在CSRF元标签
- 控制器获取文件调整
上传的文件需要用file方法获取,后续业务开发可以参考如下写法:
public function uploadFile(Request $request){ // 调试可以先打印所有请求参数,确认能拿到file字段 dd($request->all()); // 后续获取文件的标准写法 // $file = $request->file('file'); // 存储文件到storage/app/public目录的示例 // $path = $file->store('public'); }- 控制器获取文件调整
内容的提问来源于stack exchange,提问作者mr kobeng
相关产品推荐
相关产品推荐

