Laravel 6中使用PUT方法AJAX请求导致$request->all()返回空数组
解决Laravel 6中PUT方法提交FormData后端无法获取数据的问题
这个问题我之前也碰到过,本质是浏览器原生不支持使用PUT/PATCH方法发送multipart/form-data类型的请求,Laravel的表单方法伪造机制刚好能完美解决这个问题,下面给你具体的解决步骤:
核心解决思路
浏览器只能通过POST方法发送带文件的FormData请求,我们可以借助Laravel的_method字段伪造PUT请求,让后端识别为PUT方法处理,同时不影响FormData的解析(包括文件上传)。
具体修改步骤
1. 更新前端AJAX代码
把AJAX的请求方法改为POST,并在FormData中追加两个关键字段:
_method: 值为PUT,告诉Laravel这是一个模拟的PUT请求_token: Laravel的CSRF令牌,避免419验证错误
修改后的完整JS代码:
$(document).ready(function () { $('#formTest').on('submit', function (e) { e.preventDefault(); var formData = new FormData($(this)[0]); // 追加PUT方法伪造字段 formData.append('_method', 'PUT'); // 追加CSRF令牌(确保页面已包含<meta name="csrf-token" content="...">标签) formData.append('_token', $('meta[name="csrf-token"]').attr('content')); $.ajax({ url: '<?echo($config->get('apiUrl'))?>movies/13', type: 'POST', // 改为POST方法 processData: false, contentType: false, data: formData, success: function(result) { console.log('提交成功:', result); }, error: function(data) { console.log('提交失败:', data); } }); }); });
2. 确保页面包含CSRF令牌
在你的HTML头部添加CSRF令牌的meta标签(Laravel项目默认已经包含,可确认一下):
<meta name="csrf-token" content="{{ csrf_token() }}">
3. 后端控制器无需修改
你的控制器方法保持原样即可,Laravel会自动识别_method字段并按PUT请求处理,同时能正常解析FormData中的所有数据(包括文件):
public function update(Request $request, $id) { // 现在可以正常获取所有表单数据 var_dump($request->all()); // 如果需要处理文件上传,直接使用以下方式获取 // $uploadedFile = $request->file('your_file_input_name'); // $uploadedFile->store('uploads'); // ... 后续业务逻辑 }
为什么这个方法有效?
- 浏览器的XMLHttpRequest规范限制:仅允许POST方法发送
multipart/form-data类型的请求,PUT/PATCH方法发送时服务器无法正确解析 - Laravel的表单方法伪造机制:通过
_method字段模拟PUT/PATCH/DELETE请求,既兼容浏览器的限制,又能满足RESTful API的路由设计 - 完全支持文件上传:FormData中的文件会被Laravel正常解析,和POST方法提交文件的处理逻辑一致
内容的提问来源于stack exchange,提问作者Emmanuel Fernandez
相关产品推荐
相关产品推荐

