繁体   English   中英

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

[英]Laravel Updating both data and files in one form using Ajax? when method/type='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);
    }

这是自 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 ,这是唯一的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM