Что вызывает невозможность физического удаления образа с сервера в этом приложении Laravel 8?

#php #laravel #laravel-8

Вопрос:

Я работаю над приложением Laravel 8, которое требует регистрации пользователя и входа в систему.

После регистрации пользователи имеют возможность заменить изображение аватара по умолчанию на изображение по своему выбору. Они также могут вернуться к аватару по умолчанию (по умолчанию.png).

Проблема возникает при попытке удалить сам файл изображения с сервера после удаления.

Во routesweb.php мне есть:

 Route::post('/dashboard/profile/deleteavatar/{id}/{fileName}', [AppHttpControllersDashboardUserProfileController::class, 'deleteavatar'])->name('profile.deleteavatar');
 

Во HttpControllersDashboardUserProfileController.php мне есть:

 // Delete avatar
public function deleteavatar($id, $fileName) {
    $current_user = Auth::user();
    $current_user->avatar = "default.png";
    $current_user->save();

    if(File::exists(public_path('images/avatars' . $fileName))){
        File::delete(public_path('images/avatars' . $fileName));
    }
}
 

В app.js :

 (function() {
    //Delete Avatar
    $('#delete-avatar').on('click', function(evt) {
        evt.preventDefault();
        var $avatar = $('#avatar-container').find('img');
        var $topAvatar = $('#top_avatar');
        var $trashIcon = $(this);
        var defaultAvatar = APP_URL   '/images/avatars/default.png';

        //Get user's ID
        var id = $(this).data('uid');
        var fileName = $avatar.attr('src').split('/').reverse()[0];

        if (confirm('Delete the avatar?')) {
            var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');
            $.ajax({
                url: APP_URL   `/dashboard/profile/deleteavatar/${id}/${fileName}`,
                method: 'POST',
                data: {
                    id: id,
                    fileName: fileName,
                    _token: CSRF_TOKEN,
                },
                success: function() {
                    $avatar.attr('src', defaultAvatar);
                    $topAvatar.attr('src', defaultAvatar);
                    $trashIcon.remove();
                }
            });
        }
    });
})();
 

Когда я удаляю аватар пользователя, происходит следующее:

  1. Аватар заменяется на default.png в avatar столбце таблицы пользователей.
  2. Консоль Chrome показывает 500 (Internal Server Error) ошибку.
  3. Изображение НЕ удаляется из деарвера.

Что я упускаю?

Комментарии:

1. можете ли вы включить журнал ошибок .посмотрите, что вы получаете APP_DEBUG=true в .env

2. также, где существует файл .находится ли он в хранилище/приложении/общедоступном ?

3. Вы проверили журналы ошибок?

Ответ №1:

Если вы храните изображения в общей папке, значит, вы импортировали неправильный файл импорта

Вам следует импортировать

   use IlluminateSupportFacadesFile;
 

тогда я предполагаю, что изображения есть public/images/avatars/avatar.png .

 if(File::exists(public_path('images/avatars/' . $fileName))){
    File::delete(public_path('images/avatars/' . $fileName));
}
 

Предположим, что если у вас есть файлы storage/app/public/images/avatars , то вам следует сделать следующее

 if (Storage::exists('public/images/avatars/'. $fileName)) {
        Storage::delete('public/images/avatars/'. $fileName);
    }
 

Также не забудьте импортировать правильный

 use IlluminateSupportFacadesStorage;
 

Комментарии:

1. А, точно. Я думаю, что забыл импортировать и использовать правильный фасад. Я проверю это, как только сяду за компьютер.

Ответ №2:

Этот метод опасен, но должен работать:

В HttpControllersDashboardUserProfileController.php вы можете использовать @unlink для удаления файла, игнорируя ошибки, если ваш файл существует, он будет удален, а если ничего не произойдет.

 // Delete avatar
public function deleteavatar($id, $fileName) {
    $current_user = Auth::user();
    $current_user->avatar = "default.png";
    $current_user->save();

    @unlink(public_path('images/avatars/' . $fileName));
}