You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:22:20