首页 > 解决方案 > Laravel 使用 Ajax 以一种形式更新数据和文件?当方法/类型='PUT'

问题描述

好吧,当我不使用 ajax 通过添加隐藏的 _method 参数(其中值为“PUT”)直接从表单向服务器发送数据时 -> 一切都像更新表单的魅力一样工作。但是,当我尝试使用 ajax 在控制器更新功能中为 $request 对象接收 null 时尝试相同的操作。现在我很害怕删除我必须使用method='POST'。

我同时使用了 method='POST' 或 type='POST' 但没有运气。

Route::resource('contents', 'ContentController');
let url_content_update = "{{ route('contents.update', ':id') }}";

WebApp.ContentController.onClickUpdateButton = function () {
    var _id = $("#form_id").data('_id');
    var form = $("#form_id")[0];
    var formData = new FormData(form);
    console.log(formData.get('title'));// console print "I am title" just fine.
    $.ajax({
         headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        },
        url: url_content_update.replace(':id', _id),
        method: 'PUT',
        contentType:false ,
        processData: false,
        data: formData,
        xhr: function() {
            var xhr = new window.XMLHttpRequest();
            xhr.upload.addEventListener("progress", function(evt) {
                if (evt.lengthComputable) {
                    var percentComplete = evt.loaded / evt.total;
                    $('#status').html('Upload a file (compulsory):<b> Uploading -> ' + (Math.round(percentComplete * 100)) + '% </b>');
                }
            }, false);

            return xhr;
        },
        success: function (result) {

        },
        error: function (jqXHR, exception) {
        }

    })

}

控制器: 成功接收到 $id=383 的值。 但在 $request 对象中发现 null;

 public function update(Request $request,  $id)
    {
        $content = Content::find($id); 
        $content->app_id=$request->app_cat; 
        $content->cat_id=$request->category;
        $content->sub_cat_id=$request->subcategory;
        $content->title=$request->title;
        $content->content_type=$request->type;
        if($request->type==3||$request->type==4||$request->type==5){
            //return json_encode($request->hasFile('any_file'));
            if($request->hasFile('any_file')){
                $content->content=$this->storeFile($request);
            }
        }else{
            $content->content=$request->content;
        }

        $fileNameToStore='no_image.jpg';
        if($request->hasFile('cover_image')){
            $this->validate($request,[
                'cover_image'=>'image|nullable|max:1999'
            ]);
            $content->cover_image=$this->storeImage($request);
        }

        $content->save();
        $output = array("message"=>"Content updated successfully", "status" => "200");
        echo json_encode($output);
    }

标签: javascripthtmlajaxlaravelrequest

解决方案


这是自 2016 年以来的一个已知问题,这是您put以传统形式提交的方式。

<form action="/foo/bar" method="POST">
    @method('PUT')
    @csrf
</form>

所以基本上如果你想使用FormData你不能使用putpatch作为方法,你必须使用post. 另外,你需要告诉 laravel 请求应该是这样的,PUT所以你的代码必须是这样的

   ...
            var formData = new FormData(form);
            //this line is equivalent with @method('PUT') in traditional form
            formData.append('_method', 'PUT');
   ...
            //this line is equivalent with method="POST" in traditional form
            method: 'POST',

不幸的是,如果您想使用FormData.


推荐阅读