Я пытаюсь обновить единственную фотографию пользователя, использующего ajax в laravel. Затем я получаю исключение HTTP, запрещенное для метода. Но я не мог найти причину, по которой метод не разрешен? Во время обновления, как написать метод в ajax, в форме или маршруте laravel. Кто-нибудь может мне помочь?

В

index.blade.php

<form id="photoForm" enctype="multipart/form-data" method="POST">
       {{ csrf_field() }}
       {{ method_field('PATCH') }}
   <!-- Modal Header -->
   <div class="modal-header">
        <p class="modal-title">Update Profile Picture</p>
        <button type="button" class="close" data-dismiss="modal">&times;</button>
    </div>

     <!-- Modal body -->
     <div class="modal-body">
         <div class="input-file-container">  
              <input name="photo" class="input-file" id="my-file" type="file">
              <label tabindex="0" for="my-file" class="input-file-trigger">Select a Photo...</label>
         </div>
          <p class="file-return"></p>
          <small id="photo-error"></small>
    </div>

     <!-- Modal footer -->
     <div class="modal-footer">
          <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
          <button type="submit" class="btn btn-primary" id="update-btn">Update</button>
     </div>
 </form>

вызов ajax

$(document).ready(function(){

        $("#update-btn").click(function(){

            var photo = $("#my-file").val();

            $.ajax({
                url:'{{ url('change-photo/'.Auth::user()->id) }}',
                method:'POST',
                data:photo,
                success:function(data)
                {

                     if(data.errors) {
                         if(data.errors.photo){
                             $( '#photo-error' ).html( data.errors.photo[0] );
                         }

                     }
                    console.log(data);
                }
            });
        });
    }); 

web.php

Route::group(['middleware' => 'auth'], function () {
    Route::patch('change-photo/{id}', 'ProfileController@updatePhoto');
});

ProfileController.php

public function updatePhoto(Request $request, $id)
{

    $user = User::find($id);

    if (! $request->photo == '') {
        $user->photo = $request->photo;
        if ($file = $request->file('photo')) {
            $extension = $file->getClientOriginalExtension() ?: 'png';
            $folderName = '/uploads/user/photo';
            $destinationPath = public_path() . $folderName;
            $safeName = str_random(10) . '.' . $extension;
            $file->move($destinationPath, $safeName);
            //delete old photo if exists
            if (File::exists(public_path() . $folderName . $user->photo)) {
                File::delete(public_path() . $folderName . $user->photo);
            }
            //save new file path into db
            $user->photo = $safeName;

        }
    }

    $user->save();

    return back();
}
2
Rashed Hasan 14 Мар 2018 в 13:34

1 ответ

Лучший ответ

Отправьте файл, используя данные формы и метод подмены, чтобы использовать конечную точку patch

$(document).ready(function() {
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });

    $("#update-btn").click(function(e) {
        e.preventDefault();

        var formData = new FormData();
        formData.append('photo', $('#my-file')[0].files[0]);
        formData.append('_method', 'PATCH');

        $.ajax({
            url: "{{ url('change-photo/'.Auth::user()->id) }}",
            method: 'POST',
            data: formData,
            contentType: false,
            processData: false,
            success: function(data) {
                if(data.errors) {
                    if(data.errors.photo) {
                        $( '#photo-error' ).html( data.errors.photo[0] );
                    }
                }
                console.log(data);
            }
        });
    });
});
1
linktoahref 14 Мар 2018 в 15:34