#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();
}
});
}
});
})();
Когда я удаляю аватар пользователя, происходит следующее:
- Аватар заменяется на
default.png
вavatar
столбце таблицы пользователей. - Консоль Chrome показывает
500 (Internal Server Error)
ошибку. - Изображение НЕ удаляется из деарвера.
Что я упускаю?
Комментарии:
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));
}