Файл существует, не работает в laravel для файла, который тут же - PullRequest
0 голосов
/ 17 октября 2018

В моем проекте laravel у меня есть форма для загрузки файла и его удаления.Я создаю диск в config / filesystem:

'upload' => [
            'driver' => 'local',
            'root' => public_path(),
            'url' => env('APP_URL'),
            'visibility' => 'public',
        ],

Здесь загрузка файла работает правильно, но когда я хочу удалить их из общей папки, файл не существует:

$img_path = public_path( $this->directory . '/' . $this->getFliename());
$img_path = str_replace( "/",'\\', $img_path); // checked with it & without it

// $img_path= "C:\Users\Me\Desktop\final\public\upload\users\1\5bc722d2b7c05.jpg"

dump(File::exists($img_path)); // it always return false

// and then which one
File::delete($img_path); 
Storage::disk('upload')->delete($img_path);

почему этот файл нене существует, и какой для удаления файла является правдой?

Это становится более сложным, когда я делаю это с маршрутом ???

// testing ...
Route::get('/test', function (){
   File::delete('C:\Users\Me\Desktop\final\public\upload\users\1\5bc722d2b7c05.jpg');
});

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Файл может существовать в файловой системе, но веб-пользователь, под которым работает PHP, может не иметь разрешения на чтение, обновление или удаление файла.

В системе Linux или Mac вы будете иметьКак правило, пользователь должен предоставить владельцу файла право доступа к файлу и установить для него права доступа 664, а для папки - 775.

644 и 755 также должны работать и предоставлять вам более строгие разрешения.

Есливышеприведенный сбой, попробуйте 777 просто для отладки, но не делайте этого на производстве, поскольку это серьезная проблема безопасности.

Я не уверен, как это делается в Windows, но, надеюсь, это даст вам правопуть.

0 голосов
/ 17 октября 2018

Ваш $ img_path, по-видимому, задан с полным путем к файлу, а не путем относительно базы вашего указанного диска, который был бы возвращен $file->storeAs() при сохранении файла.

Это должно работать:

Storage::disk('upload')->delete('upload/users/1/5bc722d2b7c05.jpg')

Если по какой-то причине вам нужен полный путь на диске, попробуйте следующее:

Storage::disk('upload')->path('upload/users/1/5bc722d2b7c05.jpg')

Проверьте, существует ли файл:

Storage::disk('upload)->exists('upload/users/1/5bc722d2b7c05.jpg') ИЛИ File::exists(Storage::disk('upload')->path('upload/users/1/5bc722d2b7c05.jpg'))

(возвращает C:\Users\Me\Desktop\final\public\upload/users/1/5bc722d2b7c05.jpg, так как ваш диск для загрузки имеет базу public_path())

Разрешения на чтение / запись для веб-сервера также могут входить в игру, в зависимости от конфигурации вашего сервера.Обычно вы не будете хранить вещи непосредственно в папке public/, а скорее в storage/app/public и использовать php artisan storage:link для создания символической ссылки на каталог хранилища.Вы можете прочитать больше здесь: https://laravel.com/docs/5.7/filesystem#the-public-disk

В качестве примечания, Windows принимает либо /, либо \, поэтому использование / значительно упрощает использование ваших сценариев в других системах и уменьшает головную боль ввыходящая строка.

0 голосов
/ 17 октября 2018

Поскольку вы храните изображения в общедоступной папке / папке загрузки:

$user_id= $user->id;
$file_name=$user->image;
$img_path=public_path('upload/users/'.$user_id. '/' .$filename);

if(is_file($img_path)){
   unlink($img_path);
   // or File::delete($img_path);  
}else{
    echo "File does not exist";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...