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

Laravel Blade表单AJAX PUT请求传文件时请求为空求助

Laravel带附件PUT请求内容为空问题解决方案

问题描述

在Laravel Blade表单开发中,创建对象用POST请求、修改对象用PUT请求,需通过AJAX同时发送文件。POST请求正常工作,但PUT请求提交的内容为空。排查发现问题源于请求配置中的processData: false,移除该行则会触发Uncaught (in promise) TypeError: Illegal invocation错误——POST请求此前也遇到过该错误,正是通过添加processData: false解决的。现寻求带附件PUT请求的可行方案。

我的代码:

const type_request = 'PUT';
const url_request = '{{ route('put_update_login', ['client' => $client, 'id' => $login->id]) }}';
let data_form = new FormData(document.getElementById(id_form));
$.ajax({
    type: type_request,
    url: url_request,
    data: data_form,
    dataType: "json",
    processData: false,
    contentType: false,
    success: function(response) {
        if (response.hasOwnProperty("route")) {
            window.open(response['route'], "_self").focus();
        } else {
            $('#alert_error').removeAttr('hidden');
            $("#alert_error").fadeTo(20000, 500000);
            let errors = response['errors'];
            $.each(errors, function (index, value) {
                $("#alert_error").last().html(value);
            });
            $(':button').prop('disabled', false);
            $('#spinner_form').prop('hidden', true);
        }
    }
});

POST与PUT版本仅type_request和url_request参数不同。

解决方案

方法1:通过FormData添加_method字段模拟PUT请求

Laravel的PUT/PATCH等非POST请求本质是通过POST请求携带_method参数实现的,直接在FormData中添加该字段即可复用POST请求的成功配置:

let data_form = new FormData(document.getElementById(id_form));
// 追加_method字段,告知Laravel实际请求方法为PUT
data_form.append('_method', 'PUT');
// 将请求类型改为POST
const type_request = 'POST';

方法2:添加X-HTTP-Method-Override请求头

若坚持使用PUT请求类型,可在AJAX配置中添加自定义请求头,让Laravel识别实际请求方法:

$.ajax({
    type: type_request,
    url: url_request,
    data: data_form,
    dataType: "json",
    processData: false,
    contentType: false,
    // 添加请求头覆盖实际请求方法
    headers: {
        'X-HTTP-Method-Override': 'PUT'
    },
    success: function(response) {
        // 原成功回调逻辑不变
    }
});

Laravel默认支持该请求头,无需额外配置。

方法3:确保CSRF令牌和路由配置正确

  • 确认路由定义为PUT类型:如Route::put('/path', [Controller::class, 'update'])或资源路由中的update方法
  • 若表单未包含@csrf指令,手动向FormData追加CSRF令牌:
data_form.append('_token', '{{ csrf_token() }}');

内容的提问来源于stack exchange,提问作者Agustín Tamayo Quiñones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:40:45