Storage delete laravel не удаляет файл
Laravel обеспечивает мощную абстракцию файловой системы благодаря замечательному пакету Flysystem PHP от Фрэнка де Йонга. Интеграция Laravel с Flysystem содержит простые драйверы для работы с локальными файловыми системами, SFTP и Amazon S3. Более того, удивительно просто переключаться между этими вариантами хранения: как локального, так и производственного серверов – поскольку API остается одинаковым для каждой системы.
Удаление файлов
Метод delete принимает имя одного файла или массив имен файлов для удаления:
При необходимости вы можете указать диск, с которого следует удалить файл:
Предварительная подготовка драйверов
Пакеты Composer
Перед использованием драйверов S3 или SFTP вам необходимо установить соответствующий пакет с помощью менеджера пакетов Composer:
- Amazon S3: composer require --with-all-dependencies league/flysystem-aws-s3-v3 "^1.0"
- SFTP: composer require league/flysystem-sftp "~1.0"
Кроме того, вы можете установить декоратор CachedAdapter для повышения производительности:
- CachedAdapter: composer require league/flysystem-cached-adapter "~1.0"
Конфигурирование драйвера S3
Информация о конфигурации драйвера S3 находится в вашем файле конфигурации config/filesystems.php . Этот файл содержит пример массива конфигурации для драйвера S3. Вы можете изменить этот массив своей собственной конфигурацией S3 и учетными данными. Для удобства эти переменные среды соответствуют соглашению об именах, используемому в интерфейсе командной строки AWS.
Конфигурирование драйвера FTP
Интеграция Laravel с Flysystem отлично работает с FTP; однако, пример конфигурации по умолчанию не включен в конфигурационный файл config/filesystems.php фреймворка. Если вам нужно настроить файловую систему FTP, вы можете использовать пример конфигурации ниже:
Конфигурирование драйвера SFTP
Интеграция Laravel с Flysystem отлично работает с SFTP; однако, пример конфигурации по умолчанию не включен в конфигурационный файл config/filesystems.php фреймворка. Если вам нужно настроить файловую систему SFTP, вы можете использовать пример конфигурации ниже:
Каталоги
Получение всех файлов каталога
Метод files возвращает массив всех файлов указанного каталога. Если вы хотите получить список всех файлов каталога, включая все подкаталоги, вы можете использовать метод allFiles :
Получение всех каталогов из каталога
Метод directories возвращает массив всех каталогов указанного каталога. Кроме того, вы можете использовать метод allDirectories , чтобы получить список всех каталогов внутри указанного каталога и всех его подкаталогов:
Создание каталога
Метод makeDirectory создаст указанный каталог, включая все необходимые подкаталоги:
Удаление каталога
Наконец, для удаления каталога и всех его файлов можно использовать метод deleteDirectory :
Локальный драйвер
При использовании драйвера local все операции с файлами выполняются относительно корневого каталога, определенного в файле конфигурации filesystems . По умолчанию это значение задано каталогом storage/app . Следовательно, следующий метод запишет файл в storage/app/example.txt :
Доступ к экземплярам дисков
Фасад Storage используется для взаимодействия с любым из ваших сконфигурированных дисков. Например, вы можете использовать метод put фасада, чтобы сохранить аватар на диске по умолчанию. Если вы вызываете методы фасада Storage без предварительного вызова метода disk , то метод будет проксирован на диск по умолчанию:
Если ваше приложение взаимодействует с несколькими дисками, то вы можете использовать метод disk фасада Storage для работы с файлами на указанном диске:
Видимость файла
В интеграции Laravel Flysystem «видимость» – это абстракция прав доступа к файлам на нескольких платформах. Файлы могут быть объявлены public или private . Когда файл объявляется public , вы указываете, что файл обычно должен быть доступен для других. Например, при использовании драйвера s3 вы можете получить URL-адреса для public файлов.
Вы можете задать видимость при записи файла с помощью метода put :
Если файл уже был сохранен, его видимость может быть получена и задана с помощью методов getVisibility и setVisibility , соответственно:
При взаимодействии с загружаемыми файлами, вы можете использовать методы storePublicly и storePubliclyAs для сохранения загружаемого файла с видимостью public :
Локальные файлы и видимость
При использовании драйвера local , видимость public интерпретируется в право доступа 0755 для каталогов и право доступа 0644 для файлов. Вы можете изменить сопоставление прав доступа в файле конфигурации filesystems вашего приложения:
Пользовательские файловые системы
Интеграция Laravel с Flysystem обеспечивает поддержку нескольких «драйверов» из коробки; однако, Flysystem этим не ограничивается и имеет адаптеры для многих других систем хранения. Вы можете создать собственный драйвер, если хотите использовать один из этих дополнительных адаптеров в своем приложении Laravel.
Чтобы определить собственную файловую систему, вам понадобится адаптер Flysystem. Давайте добавим в наш проект адаптер Dropbox, поддерживаемый сообществом:
Затем вы можете зарегистрировать драйвер в методе boot одного из поставщиков служб вашего приложения. Для этого вы должны использовать метод extend фасада Storage :
Первый аргумент метода extend – это имя драйвера, а второй – замыкание, которое получает переменные $app и $config . Замыкание должно возвращать экземпляр League\Flysystem\Filesystem . Переменная $config содержит значения, определенные в config/filesystems.php для указанного диска.
После того как вы создали и зарегистрировали расширение поставщика службы, вы можете использовать драйвер dropbox в вашем файле конфигурации config/filesystems.php .
Этот перевод актуален для англоязычной документации на 28.01.2017 (ветка 5.3) , 08.12.2016 (ветка 5.2) , 19.06.2016 (ветка 5.1) и 08.02.2016 (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.
Настройка
Настройки файловой системы находятся в файле config/filesystems.php . В нём вы можете настроить все свои «disks» . Каждый диск представляет определенный драйвер и место хранения. В конфигурационном файле имеются примеры для каждого поддерживаемого драйвера. Поэтому вы можете просто немного изменить конфигурацию под ваши нужды!
Конечно, вы можете сконфигурировать столько дисков, сколько вам будет угодно, и даже можете иметь несколько дисков, которые используют один драйвер.
Кеширование
Чтобы включить кеширование для конкретного диска, вы можете добавить директиву cache в параметры конфигурации этого диска. Параметр cache должен быть массивом параметров кеширования, содержащим имя disk , время expire в секундах и prefix кеша:
Получение файлов
Метод get используется для получения содержимого файла. Необработанное строковое содержимое файла будет возвращено методом. Помните, что все пути к файлам должны быть указаны относительно «корня» диска:
Метод exists используется для определения, существует ли файл на диске:
Метод missing используется, чтобы определить, отсутствует ли файл на диске:
Общий диск
Диск public предназначен для общего доступа к файлам. По умолчанию диск public использует драйвер local и хранит файлы в storage/app/public . Чтобы сделать их доступными через веб, вам надо создать символьную ссылку из public/storage на storage/app/public . При этом ваши общедоступные файлы будут храниться в одной папке, которую легко можно использовать в разных развёртываниях при использовании систем обновления на лету, таких как Envoyer.
Для создания символьной ссылки используйте Artisan-команду sh storage:link :
Само собой, когда файл сохранён и создана символьная ссылка, вы можете создать URL к файлу с помощью вспомогательной функции PHP asset () :
Драйвер local
При использовании драйвера local все файловые операции выполняются относительно каталога root , определенного в вашем конфигурационном файле. По умолчанию это каталог storage/app . Поэтому следующий метод сохранит файл в storage/app/file.txt :
Хранение файлов
Метод put используется для сохранения содержимого файла на диске. Вы также можете передать resource PHP методу put , который будет использовать поддержку базового потока Flysystem. Помните, что все пути к файлам должны быть указаны относительно «корневого» расположения, настроенного для диска:
Автоматическая потоковая передача
Следует отметить несколько важных моментов, касающихся метода putFile . Обратите внимание, что мы указали только имя каталога, а не имя файла. По умолчанию метод putFile генерирует уникальный идентификатор, который будет служить именем файла. Расширение файла будет определено путем проверки MIME-типа файла. Путь к файлу будет возвращен методом putFile , так что вы можете сохранить путь, включая сгенерированное имя файла, в вашей базе данных.
Методы putFile и putFileAs также принимают аргумент для определения «видимости» сохраненного файла. Это особенно полезно, если вы храните файл на облачном диске, таком как Amazon S3, и хотите, чтобы файл был общедоступным через сгенерированные URL:
Добавление информации к файлам
Методы prepend и append позволяют записывать в начало или конец файла, соответственно:
Копирование и перемещение файлов
Метод copy используется для копирования существующего файла в новое место на диске, а метод move используется для переименования или перемещения существующего файла в новое место:
Публичный диск
Диск public , определенный в файле конфигурации filesystems вашего приложения, предназначен для файлов, которые будут общедоступными. По умолчанию публичный диск использует драйвер local и хранит свои файлы в storage/app/public .
Чтобы сделать эти файлы доступными из интернета, вы должны создать символическую ссылку на storage/app/public в public/storage . Использование этого соглашения о папках позволит хранить ваши публичные файлы в одном каталоге, который может быть легко доступен между развертываниями при использовании систем развертывания с нулевым временем простоя, таких как Envoyer.
Чтобы создать символическую ссылку, вы можете использовать команду storage:link Artisan:
После того как была создана символическая ссылка, вы можете создавать URL-адреса для сохраненных файлов, используя помощник asset :
Вы можете настроить дополнительные символические ссылки в файле конфигурации filesystems . Каждая из настроенных ссылок будет создана, когда вы запустите команду storage:link :
Драйвер local
При использовании драйвера local все файловые операции выполняются относительно каталога root , определенного в вашем конфигурационном файле. По умолчанию это каталог storage/app . Поэтому следующий метод сохранит файл в storage/app/file.txt :
Введение
Laravel предоставляет мощную абстракцию для работы с файловой системой благодаря восхитительному PHP-пакету Flysystem от Франка де Жонге. Laravel Flysystem содержит простые в использовании драйвера для работы с локальными файловыми системами, Amazon S3 и Rackspace Cloud Storage. Более того, можно очень просто переключаться между этими вариантами хранения файлов, поскольку у всех одинаковый API.
Загрузка файлов
В веб-приложениях одним из наиболее распространенных вариантов хранения файлов является хранение загруженных пользователем файлов, таких как фотографии и документы. Laravel упрощает хранение загруженных файлов с помощью метода store экземпляра загружаемого файла. Вызовите метод store , указав путь, по которому вы хотите сохранить загруженный файл:
В этом примере следует отметить несколько важных моментов. Обратите внимание, что мы указали только имя каталога, а не имя файла. По умолчанию метод store генерирует уникальный идентификатор, который будет служить именем файла. Расширение файла будет определено путем проверки MIME-типа файла. Путь к файлу будет возвращен методом store , поэтому вы можете сохранить путь, включая сгенерированное имя файла, в своей базе данных.
Вы также можете вызвать метод putFile фасада Storage , чтобы выполнить ту же операцию сохранения файлов, что и в примере выше:
Указание имени файла
Если вы не хотите, чтобы имя файла автоматически присваивалось вашему сохраненному файлу, вы можете использовать метод storeAs , который получает путь, имя файла и (необязательный) диск в качестве аргументов:
Вы также можете использовать метод putFileAs фасада Storage , который будет выполнять ту же операцию сохранения файлов, что и в примере выше:
Непечатаемые и недопустимые символы Unicode будут автоматически удалены из путей к файлам. По этой причине, вы по желанию можете очистить пути к файлам перед их передачей в методы хранения файлов Laravel. Пути к файлам нормализуются с помощью метода League\Flysystem\Util::normalizePath .
Указание диска
По умолчанию метод store загружаемого файла будет использовать ваш диск по умолчанию. Если вы хотите указать другой диск, передайте имя диска в качестве второго аргумента методу store :
Если вы используете метод storeAs , вы можете передать имя диска в качестве третьего аргумента метода:
Другая информация о загружаемом файле
Если вы хотите получить оригинальное имя или расширение загружаемого файла, вы можете сделать это с помощью методов getClientOriginalName и getClientOriginalExtension :
Однако имейте в виду, что методы getClientOriginalName и getClientOriginalExtension считаются небезопасными, так как имя и расширение файла могут быть изменены злоумышленником. По этой причине вы обычно должны предпочесть методы hashName и extension чтобы получить имя и расширение для загружаемого файла:
Файловые системы, совместимые с Amazon S3
По умолчанию файл конфигурации вашего приложения filesystems содержит конфигурацию диска для диска s3 . Помимо использования этого диска для взаимодействия с Amazon S3, вы можете использовать его для взаимодействия с любой совместимой с S3 службой хранения файлов, такой как MinIO или DigitalOcean Spaces.
Обычно после обновления учетных данных диска для соответствия учетным данным службы, которую вы планируете использовать, вам нужно только обновить значение параметра конфигурации url . Значение этой опции обычно определяется через переменную окружения AWS_ENDPOINT :
Получение экземпляров дисков
Для взаимодействия с любым из ваших сконфигурированных дисков можно использовать фасад Storage . Например, вы можете использовать метод этого фасада PHP put () , чтобы сохранить аватар на диск по умолчанию. Если вы вызовите метод фасада Storage без предварительного вызова метода PHP disk () , то вызов метода будет автоматически передан диску по умолчанию:
Этот перевод актуален для англоязычной документации на 28.01.2017 (ветка 5.3) , 08.12.2016 (ветка 5.2) , 19.06.2016 (ветка 5.1) и 08.02.2016 (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.
Диски по запросу
Иногда вы можете захотеть создать диск во время выполнения, используя заданную конфигурацию, без того, чтобы эта конфигурация фактически присутствовала в файле конфигурации вашего приложения filesystems . Для этого вы можете передать массив конфигурации методу build фасада Storage :
Настройка
Настройки файловой системы находятся в файле config/filesystems.php . В нём вы можете настроить все свои «disks» . Каждый диск представляет определенный драйвер и место хранения. В конфигурационном файле имеются примеры для каждого поддерживаемого драйвера. Поэтому вы можете просто немного изменить конфигурацию под ваши нужды!
Конечно, вы можете сконфигурировать столько дисков, сколько вам будет угодно, и даже можете иметь несколько дисков, которые используют один драйвер.
Получение экземпляров дисков
Для взаимодействия с любым из ваших сконфигурированных дисков можно использовать фасад Storage . Например, вы можете использовать метод этого фасада PHP put () , чтобы сохранить аватар на диск по умолчанию. Если вы вызовите метод фасада Storage без предварительного вызова метода PHP disk () , то вызов метода будет автоматически передан диску по умолчанию:
Путь файла в базе данных хранится в таком виде - и для нее не работает, в delete нужно указывать путь такого формата
Как решить проблему?
Есть ли способ хранить в базе данных только имя файла, а не весь путь?
Простой 2 комментария
Чтение документации и изучение хорошей пратики всё таки немного облегчает жизнь.
Итак.
Хранить в БД url, как делаете вы, обычно не выгодно и неинтересно. Это нужно в исключительных случаях одно разового мини проекта, когда вы точно знаете настроки меняться не будут и файлы редактироваться не будут. Либо, в специализированных БД для кеширования результата генерации url.
В иных случаях хранить в БД нужно имя файла. Имя файла в идеале разбить конечно, но в подавляющем числе случаев достаточно будет два поля: имя с путём + имя диска. Это закроет большинство кейсов для будущего масштабирования. Но если уж совсем лень, то имя диска тоже можно опустить, хотя я советую добавить это поле.
Далее, ваш код:
Меняем на более простой (хотя аналог можно и из вашего конечно сделать, убрав строчку с $url и сохраняя в модель $path)
Теперь и удалать легко. не забываем что с файлами мы работаем(по умолчанию), относительно папки /storage/app/ (слеш в начале я поставил чтобы показать что путь от корня папки с проектом)
Поэтому, когда вы передаёте в метод удаления сгенерированный заранее url. он ничего не найдёт и не удалит.
Но теперь мы храним как раз относительный путь файла.
Storage::delete($post->img);
Теперь сработает, не забываем очистить поле, после удаления, если вы при этом не удаляете сам пост.
Далее, сам url получаем так
$url = asset($post->img);
Ну, или если вы делаете сразу в blade шаблонах
Ну и конечно я всякие проверки и тп опустил для простоты
Вы можете использовать метод PHP unlink() так же, как предложил @Khan.
Но если вы хотите сделать это способом Laravel, используйте вместо этого метод File :: delete ().
// Удалить один файл
// Удалить несколько файлов
// Удалить массив файлов
И не забудьте добавить вверху:
Решено путем изменения пути следующим образом: $image_path = public_path().'/'.$news->photo; развязать ($ image_path);
Вы также можете попробовать это, чтобы удалить файл в какой-либо папке, в моем случае имя папки — «pdf_uploads», поэтому вы можете написать так: $file_path = public_path('pdf_uploads').'/'.$items->file;
Используйте функцию php unlink, просто укажите точный путь к вашему файлу, чтобы отключить функцию :
Не забудьте создать полный путь к вашему файлу, если он не хранится в БД. например
Этот метод сработал для меня
Во-первых, поместите строку ниже в начале вашего контроллера:
Ниже пространства имен в вашем файле php Второе:
$destinationPath --> папка внутри общедоступной папки.
Во-первых, вы должны перейти к config/filesystems.php и установить 'root' => public_path() следующим образом:
Затем вы можете использовать Storage::delete($filename);
Это ответ. Похоже, что в настоящее время система хранения Laravel по умолчанию использует локальную, что делает удаление видимым в папке приложения. Неправильный.
Чтобы добавить к этому ответу, вы также можете создать новый диск с именем public_root и обновить значения по мере необходимости.
Используя функцию PHP unlink() , файл будет удален
Вышеприведенное удалит изображение, возвращенное $from_db->image_name , расположенное в папке public/uploads .
Посмотрите на точку и конкатенацию перед вызовом фасадного хранилища.
Обновление работает для Laravel 8.x:
Удаление изображения например ->
Прежде всего добавьте файловый фасад вверху контроллера:
Затем используйте функцию удаления. Если файл находится в «общедоступном/», вы должны указать путь, используя функцию public_path():
Это работало на laravel 8
Сначала убедитесь, что файл существует, построив путь
Попробуйте: Laravel 5.5
Это очень старая ветка, но я не вижу, чтобы решение было здесь или эта ветка помечена как решенная. Я также застрял в той же проблеме, я решил ее так
Ключ в том, что вам нужно удалить «..» из метода удаления. Имейте в виду, что это верно, если вы также используете хранилище, независимо от того, используете ли вы хранилище файлов, не используйте их, например
Надеюсь, что это кому-то поможет.
Сначала вы должны импортировать это поверх класса модели use Illuminate\Support\Facades\Storage после этого в классе модели News вы должны сделать это
Или вы можете удалить изображение в своем контроллере с помощью этой команды
Но вы должны знать, что диск по умолчанию является общедоступным, но если вы создадите папку в общей папке и поместите изображение на нее, вы должны установить имя папки перед $news->file_name
URL-адреса файлов
Вы можете использовать метод url , чтобы получить URL для указанного файла. Если вы используете драйвер local , он обычно просто добавляет /storage к указанному пути и возвращает относительный URL-адрес файла. Если вы используете драйвер s3 , будет возвращен абсолютный внешний URL-адрес:
При использовании драйвера local все файлы, которые должны быть общедоступными, должны быть помещены в каталог storage/app/public . Кроме того, вы должны создать символическую ссылку в public/storage , которая указывает на каталог storage/app/public .
При использовании драйвера local возвращаемое значение url не является URL-кодированным. По этой причине мы рекомендуем всегда хранить ваши файлы, используя имена, которые будут создавать допустимые URL-адреса.
Временные URL
Используя метод temporaryUrl , вы можете создавать временные URL-адреса для файлов, хранящихся с помощью драйвера s3 . Этот метод принимает путь и экземпляр DateTime , указывающий, когда должен истечь доступ к файлу по URL:
Если вам нужно указать дополнительные параметры запроса S3, то вы можете передать массив параметров запроса в качестве третьего аргумент методу temporaryUrl :
Настройка хоста URL
Если вы хотите заранее определить хост для URL-адресов, сгенерированных с помощью фасада Storage , то вы можете добавить параметр url в массив конфигурации диска:
Введение
Laravel предоставляет мощную абстракцию для работы с файловой системой благодаря восхитительному PHP-пакету Flysystem от Франка де Жонге. Laravel Flysystem содержит простые в использовании драйвера для работы с локальными файловыми системами, Amazon S3 и Rackspace Cloud Storage. Более того, можно очень просто переключаться между этими вариантами хранения файлов, поскольку у всех одинаковый API.
Скачивание файлов
Общий диск
Диск public предназначен для общего доступа к файлам. По умолчанию диск public использует драйвер local и хранит файлы в storage/app/public . Чтобы сделать их доступными через веб, вам надо создать символьную ссылку из public/storage на storage/app/public . При этом ваши общедоступные файлы будут храниться в одной папке, которую легко можно использовать в разных развёртываниях при использовании систем обновления на лету, таких как Envoyer.
Для создания символьной ссылки используйте Artisan-команду sh storage:link :
Само собой, когда файл сохранён и создана символьная ссылка, вы можете создать URL к файлу с помощью вспомогательной функции PHP asset () :
Конфигурирование
Файл конфигурации файловой системы Laravel находится в config/filesystems.php . В этом файле вы можете настроить все «диски» файловой системы. Каждый диск представляет собой определенный драйвер хранилища и место хранения. Примеры конфигураций для каждого поддерживаемого драйвера включены в конфигурационный файл, так что вы можете изменить конфигурацию, отражающую ваши предпочтения хранения и учетные данные.
Драйвер local взаимодействует с файлами, хранящимися локально на сервере, на котором запущено приложение Laravel, в то время как драйвер s3 используется для записи в службу облачного хранилища Amazon S3.
Вы можете настроить столько дисков, сколько захотите, и даже иметь несколько дисков, использующих один и тот же драйвер.
Метаданные файла
Помимо чтения и записи файлов, Laravel также может предоставлять информацию о самих файлах. Например, метод size используется для получения размера файла в байтах:
Метод lastModified возвращает временную метку UNIX последнего изменения файла:
Пути к файлам
Вы можете использовать метод path , чтобы получить путь к указанному файлу. Если вы используете драйвер local , он вернет абсолютный путь к файлу. Если вы используете драйвер s3 , этот метод вернет относительный путь к файлу в корзине S3 :
Требования к драйверам
Пакеты Composer
Перед использованием S3 или Rackspace вы должны установить соответствующие пакеты при помощи Composer:
- Amazon S3: league/flysystem-aws-s3-v3 ~1.0
- Rackspace: league/flysystem-rackspace ~1.0
Настройка драйвера S3
Настройки драйвера S3 находятся в файле config/filesystems.php . Там есть пример массива настроек для драйвера S3. Вы можете отредактировать этот массив в соответствии с вашими настройками и учётными данными для S3.
Настройка драйвера FTP
Интеграция Flysystem отлично работает с FTP, но в стандартном файле настроек filesystems.php нет примера настройки FTP. Если вам надо настроить файловую систему FTP, вы можете использовать в качестве примера приведенные ниже настройки:
Настройка драйвера Rackspace
Интеграция Flysystem отлично работает с Rackspace, но в стандартном файле настроек filesystems.php нет примера настройки Rackspace. Если вам надо настроить файловую систему Rackspace, вы можете использовать в качестве примера приведенные ниже настройки:
Требования к драйверам
Пакеты Composer
Перед использованием S3 или Rackspace вы должны установить соответствующие пакеты при помощи Composer:
- Amazon S3: league/flysystem-aws-s3-v3 ~1.0
- Rackspace: league/flysystem-rackspace ~1.0
Настройка драйвера S3
Настройки драйвера S3 находятся в файле config/filesystems.php . Там есть пример массива настроек для драйвера S3. Вы можете отредактировать этот массив в соответствии с вашими настройками и учётными данными для S3.
Настройка драйвера FTP
Интеграция Flysystem отлично работает с FTP, но в стандартном файле настроек filesystems.php нет примера настройки FTP. Если вам надо настроить файловую систему FTP, вы можете использовать в качестве примера приведенные ниже настройки:
Настройка драйвера Rackspace
Интеграция Flysystem отлично работает с Rackspace, но в стандартном файле настроек filesystems.php нет примера настройки Rackspace. Если вам надо настроить файловую систему Rackspace, вы можете использовать в качестве примера приведенные ниже настройки:
Читайте также: