Laravel Обновление данных и файлов в одной форме с использованием Ajax? когда method / type = 'PUT' - PullRequest
0 голосов
/ 16 февраля 2020

Хорошо, когда я не использую ajax для отправки данных на сервер напрямую из формы, добавив скрытый параметр _method, где значение равно «PUT» -> все просто работает как чудо для обновления формы. Но когда я пытался сделать то же самое с ajax, получая null для объекта $ request в функции обновления контроллера. Прямо сейчас я чувствую испуг, что для удаления я должен использовать 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 найден ноль;

 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);
    }

1 Ответ

1 голос
/ 17 февраля 2020

Это известная проблема с 2016 года, здесь вы можете отправить put в традиционной форме.

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

, поэтому, если вы хотите использовать FormData, вы не можете использовать put или patch в качестве метода, вы должны использовать 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...