Файлове сховище

Вступ

Laravel надає потужну абстракцію файлової системи завдяки чудовому PHP пакету Flysystem від Frank de Jonge. Інтеграція Laravel з Flysystem забезпечує прості драйвери для роботи з локальними файловими системами, SFTP та Amazon S3. Ще краще, що перемикатися між цими варіантами зберігання між вашою локальною машиною розробки та сервером у виробництві надзвичайно просто, оскільки API залишається однаковим для кожної системи.

Конфігурація

Конфігураційний файл файлової системи Laravel знаходиться за адресою config/filesystems.php. У цьому файлі ви можете налаштувати всі ваші "диски" файлової системи. Кожен диск представляє певний драйвер зберігання та місце зберігання. Приклади конфігурацій для кожного підтримуваного драйвера включені в конфігураційний файл, щоб ви могли змінити конфігурацію відповідно до ваших уподобань зберігання та облікових даних.

Драйвер local взаємодіє з файлами, що зберігаються локально на сервері, де працює Laravel застосунок, тоді як драйвер зберігання sftp використовується для FTP на основі SSH-ключів. Драйвер s3 використовується для запису в хмарний сервіс зберігання Amazon S3.

Ви можете налаштувати стільки дисків, скільки забажаєте, і навіть мати декілька дисків, які використовують той самий драйвер.

Локальний драйвер

Коли використовується драйвер local, всі операції з файлами відносні до директорії root, визначеної у вашому конфігураційному файлі filesystems. За замовчуванням це значення встановлено на директорію storage/app/private. Таким чином, наступний метод запише у storage/app/private/example.txt:

use Illuminate\Support\Facades\Storage;
 
Storage::disk('local')->put('example.txt', 'Contents');

Публічний диск

Диск public, включений у файл конфігурації filesystems вашого застосунку, призначений для файлів, які будуть публічно доступними. За замовчуванням диск public використовує драйвер local і зберігає свої файли в storage/app/public.

Якщо ваш диск public використовує драйвер local і ви хочете зробити ці файли доступними з вебу, вам слід створити символічне посилання з вихідного каталогу storage/app/public до цільового каталогу public/storage:

Щоб створити символічне посилання, ви можете використовувати команду Artisan storage:link:

php artisan storage:link

Після того як файл збережено і символічне посилання створено, ви можете створити URL до файлів, використовуючи хелпер asset:

echo asset('storage/file.txt');

Ви можете налаштувати додаткові символічні посилання у вашому файлі конфігурації filesystems. Кожне з налаштованих посилань буде створено, коли ви виконаєте команду storage:link:

'links' => [
    public_path('storage') => storage_path('app/public'),
    public_path('images') => storage_path('app/images'),
],

Команда storage:unlink може бути використана для знищення ваших налаштованих символічних посилань:

php artisan storage:unlink

Вимоги до драйвера

Конфігурація драйвера S3

Перш ніж використовувати драйвер S3, вам потрібно встановити пакет Flysystem S3 через менеджер пакетів компонувальник:

composer require league/flysystem-aws-s3-v3 "^3.0" --with-all-dependencies

Масив конфігурації диска S3 знаходиться у вашому файлі конфігурації config/filesystems.php. Зазвичай, ви повинні налаштувати вашу інформацію та облікові дані S3, використовуючи наступні змінні середовища, на які посилається файл конфігурації config/filesystems.php:

AWS_ACCESS_KEY_ID=<your-key-id>
AWS_SECRET_ACCESS_KEY=<your-secret-access-key>
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=<your-bucket-name>
AWS_USE_PATH_STYLE_ENDPOINT=false

Для зручності ці змінні середовища відповідають конвенції іменування, що використовується AWS CLI.

Конфігурація драйвера FTP

Перш ніж використовувати драйвер FTP, вам потрібно встановити пакет Flysystem FTP через менеджер пакетів компонувальник:

composer require league/flysystem-ftp "^3.0"

Інтеграції Laravel з Flysystem чудово працюють з FTP; однак, приклад конфігурації не включено у файл конфігурації за замовчуванням config/filesystems.php фреймворку. Якщо вам потрібно налаштувати файлову систему FTP, ви можете скористатися наведеним нижче прикладом конфігурації:

'ftp' => [
'driver' => 'ftp',
'host' => env('FTP_HOST'),
'username' => env('FTP_USERNAME'),
'password' => env('FTP_PASSWORD'),
 
// Необов’язкові налаштування SFTP...
// 'port' => env('FTP_PORT', 21),
// 'root' => env('FTP_ROOT'),
// 'passive' => true,
// 'ssl' => true,
// 'timeout' => 30,
],

Конфігурація драйвера SFTP

Перш ніж використовувати драйвер SFTP, вам потрібно встановити пакет Flysystem SFTP через менеджер пакетів компонувальник:

composer require league/flysystem-sftp-v3 "^3.0"

Інтеграції Laravel з Flysystem чудово працюють з SFTP; однак, приклад конфігурації не включено у файл конфігурації config/filesystems.php за замовчуванням. Якщо вам потрібно налаштувати файлову систему SFTP, ви можете скористатися наведеним нижче прикладом конфігурації:

'sftp' => [
'driver' => 'sftp',
'host' => env('SFTP_HOST'),
 
// Налаштування базової автентифікації...
'username' => env('SFTP_USERNAME'),
'password' => env('SFTP_PASSWORD'),
 
// Налаштування автентифікації на основі SSH-ключа з паролем шифрування...
'privateKey' => env('SFTP_PRIVATE_KEY'),
'passphrase' => env('SFTP_PASSPHRASE'),
 
// Налаштування прав доступу до файлів / каталогів...
'visibility' => 'private', // `private` = 0600, `public` = 0644
'directory_visibility' => 'private', // `private` = 0700, `public` = 0755
 
// Необов’язкові налаштування SFTP...
// 'hostFingerprint' => env('SFTP_HOST_FINGERPRINT'),
// 'maxTries' => 4,
// 'passphrase' => env('SFTP_PASSPHRASE'),
// 'port' => env('SFTP_PORT', 22),
// 'root' => env('SFTP_ROOT', ''),
// 'timeout' => 30,
// 'useAgent' => true,
],

Обмежені та лише для читання файлові системи

Scoped диски дозволяють визначити файлову систему, де всі шляхи автоматично мають префікс з заданим префіксом шляху. Перед створенням scoped файлової системи диска, вам потрібно встановити додатковий пакет Flysystem через менеджер пакетів Composer:

composer require league/flysystem-path-prefixing "^3.0"

Ви можете створити екземпляр файлової системи з обмеженим шляхом для будь-якого існуючого диска, визначивши диск, який використовує драйвер scoped. Наприклад, ви можете створити диск, який обмежує ваш існуючий диск s3 до певного префікса шляху, і тоді кожна операція з файлами, використовуючи ваш обмежений диск, буде використовувати вказаний префікс:

's3-videos' => [
    'driver' => 'scoped',
    'disk' => 's3',
    'prefix' => 'path/to/videos',
],

"Тільки для читання" диски дозволяють створювати файлові системи, які не дозволяють операції запису. Перед використанням опції конфігурації read-only, вам потрібно встановити додатковий пакет Flysystem через менеджер пакетів компонувальник:

composer require league/flysystem-read-only "^3.0"

Далі, ви можете включити опцію конфігурації read-only в одну або кілька конфігураційних масивів вашого диска:

's3-videos' => [
    'driver' => 's3',
    // ...
    'read-only' => true,
],

Файлові системи, сумісні з Amazon S3

За замовчуванням, файл конфігурації filesystems вашого застосунку містить конфігурацію диска для диска s3. Окрім використання цього диска для взаємодії з Amazon S3, ви можете використовувати його для взаємодії з будь-якою сумісною з S3 службою зберігання файлів, такою як MinIO, DigitalOcean Spaces, Vultr Object Storage, Cloudflare R2 або Hetzner Cloud Storage.

Зазвичай, після оновлення облікових даних диска, щоб вони відповідали обліковим даним сервісу, який ви плануєте використовувати, вам потрібно лише оновити значення параметра конфігурації endpoint. Значення цього параметра зазвичай визначається через змінну середовища AWS_ENDPOINT:

'endpoint' => env('AWS_ENDPOINT', 'https://minio:9000'),

MinIO

Щоб інтеграція Flysystem у Laravel генерувала правильні URL-адреси при використанні MinIO, ви повинні визначити змінну середовища AWS_URL так, щоб вона відповідала локальній URL-адресі вашого застосунку і включала ім'я бакета в шлях URL:

AWS_URL=http://localhost:9000/local

Генерація тимчасових URL-адрес сховища за допомогою методу temporaryUrl може не працювати при використанні MinIO, якщо endpoint недоступний для клієнта.

Отримання екземплярів диска

Фасад Storage може бути використаний для взаємодії з будь-яким з ваших налаштованих дисків. Наприклад, ви можете використовувати метод put на фасаді, щоб зберегти аватар на диску за замовчуванням. Якщо ви викликаєте методи на фасаді Storage без попереднього виклику методу disk, метод автоматично буде переданий на диск за замовчуванням:

use Illuminate\Support\Facades\Storage;
 
Storage::put('avatars/1', $content);

Якщо ваш застосунок взаємодіє з декількома дисками, ви можете використовувати метод disk на фасаді Storage для роботи з файлами на конкретному диску:

Storage::disk('s3')->put('avatars/1', $content);

Диски на вимогу

Іноді ви можете захотіти створити диск під час виконання, використовуючи задану конфігурацію, без фактичної наявності цієї конфігурації у файлі конфігурації filesystems вашого застосунку. Щоб досягти цього, ви можете передати масив конфігурації до методу build фасаду Storage:

use Illuminate\Support\Facades\Storage;
 
$disk = Storage::build([
    'driver' => 'local',
    'root' => '/path/to/root',
]);
 
$disk->put('image.jpg', $content);

Отримання файлів

Метод get може бути використаний для отримання вмісту файлу. Метод поверне сирий рядковий вміст файлу. Пам'ятайте, всі шляхи до файлів повинні бути вказані відносно "кореневого" розташування диска:

$contents = Storage::get('file.jpg');

Якщо файл, який ви отримуєте, містить JSON, ви можете використовувати метод json, щоб отримати файл і декодувати його вміст:

$orders = Storage::json('orders.json');

Метод exists може бути використаний для визначення, чи існує файл на диску:

if (Storage::disk('s3')->exists('file.jpg')) {
    // ...
}

Метод missing може бути використаний для визначення, чи відсутній файл на диску:

if (Storage::disk('s3')->missing('file.jpg')) {
    // ...
}

Завантаження файлів

Метод download може бути використаний для створення відповіді, яка змушує браузер користувача завантажити файл за вказаним шляхом. Метод download приймає ім'я файлу як другий аргумент методу, яке визначатиме ім'я файлу, що буде видно користувачу, який завантажує файл. Нарешті, ви можете передати масив HTTP-заголовків як третій аргумент методу:

return Storage::download('file.jpg');
 
return Storage::download('file.jpg', $name, $headers);

URL файлів

Ви можете використовувати метод url, щоб отримати URL для заданого файлу. Якщо ви використовуєте драйвер local, це зазвичай просто додає /storage до заданого шляху і повертає відносний URL до файлу. Якщо ви використовуєте драйвер s3, буде повернуто повністю кваліфікований віддалений URL:

use Illuminate\Support\Facades\Storage;
 
$url = Storage::url('file.jpg');

Коли ви використовуєте драйвер local, всі файли, які повинні бути публічно доступними, слід розміщувати в каталозі storage/app/public. Крім того, ви повинні створити символічне посилання в public/storage, яке вказує на каталог storage/app/public.

Коли використовується драйвер local, значення, що повертається url, не кодується як URL. З цієї причини ми рекомендуємо завжди зберігати ваші файли з іменами, які створять дійсні URL.

Налаштування хоста URL

Якщо ви хочете змінити хост для URL-адрес, згенерованих за допомогою фасаду Storage, ви можете додати або змінити опцію url у конфігураційному масиві диска:

'public' => [
    'driver' => 'local',
    'root' => storage_path('app/public'),
    'url' => env('APP_URL').'/storage',
    'visibility' => 'public',
    'throw' => false,
],

Тимчасові URL-адреси

Використовуючи метод temporaryUrl, ви можете створювати тимчасові URL-адреси до файлів, збережених за допомогою драйверів local та s3. Цей метод приймає шлях і екземпляр DateTime, що вказує, коли URL-адреса повинна закінчити свою дію:

use Illuminate\Support\Facades\Storage;
 
$url = Storage::temporaryUrl(
    'file.jpg', now()->addMinutes(5)
);

Увімкнення локальних тимчасових URL-адрес

Якщо ви почали розробку вашого застосунку до того, як підтримка тимчасових URL-адрес була введена для драйвера local, можливо, вам потрібно увімкнути локальні тимчасові URL-адреси. Для цього додайте опцію serve до конфігураційного масиву диска local у файлі конфігурації config/filesystems.php:

'local' => [
    'driver' => 'local',
    'root' => storage_path('app/private'),
    'serve' => true, 
    'throw' => false,
],

Параметри запиту S3

Якщо вам потрібно вказати додаткові параметри запиту S3, ви можете передати масив параметрів запиту як третій аргумент методу temporaryUrl:

$url = Storage::temporaryUrl(
    'file.jpg',
    now()->addMinutes(5),
    [
        'ResponseContentType' => 'application/octet-stream',
        'ResponseContentDisposition' => 'attachment; filename=file2.jpg',
    ]
);

Налаштування тимчасових URL-адрес

Якщо вам потрібно налаштувати, як створюються тимчасові URL-адреси для конкретного диска зберігання, ви можете використовувати метод buildTemporaryUrlsUsing. Наприклад, це може бути корисно, якщо у вас є контролер, який дозволяє завантажувати файли, збережені через диск, який зазвичай не підтримує тимчасові URL-адреси. Зазвичай цей метод слід викликати з методу boot сервіс-провайдера:

<?php
 
namespace App\Providers;
 
use DateTime;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider
{
/**
* Ініціалізувати будь-які сервіси застосунку.
*/
public function boot(): void
{
Storage::disk('local')->buildTemporaryUrlsUsing(
function (string $path, DateTime $expiration, array $options) {
return URL::temporarySignedRoute(
'files.download',
$expiration,
array_merge($options, ['path' => $path])
);
}
);
}
}

Тимчасові URL-адреси для завантаження

Можливість генерувати тимчасові URL-адреси для завантаження підтримується лише драйвером s3.

Якщо вам потрібно згенерувати тимчасову URL-адресу, яку можна використовувати для завантаження файлу безпосередньо з вашого клієнтського застосунку, ви можете скористатися методом temporaryUploadUrl. Цей метод приймає шлях і екземпляр DateTime, що вказує, коли URL-адреса повинна закінчитися. Метод temporaryUploadUrl повертає асоціативний масив, який можна розбити на URL-адресу завантаження та заголовки, які слід включити в запит на завантаження:

use Illuminate\Support\Facades\Storage;
 
['url' => $url, 'headers' => $headers] = Storage::temporaryUploadUrl(
    'file.jpg', now()->addMinutes(5)
);

Цей метод є в основному корисним у безсерверних середовищах, які вимагають, щоб клієнтський застосунок безпосередньо завантажував файли в хмарну систему зберігання, таку як Amazon S3.

Метадані файлу

Крім читання та запису файлів, Laravel також може надавати інформацію про самі файли. Наприклад, метод size може бути використаний для отримання розміру файлу в байтах:

use Illuminate\Support\Facades\Storage;
 
$size = Storage::size('file.jpg');

Метод lastModified повертає UNIX-мітку часу останнього разу, коли файл було змінено:

$time = Storage::lastModified('file.jpg');

Тип MIME даного файлу можна отримати за допомогою методу mimeType:

$mime = Storage::mimeType('file.jpg');

Шляхи до файлів

Ви можете використовувати метод path, щоб отримати шлях до вказаного файлу. Якщо ви використовуєте драйвер local, це поверне абсолютний шлях до файлу. Якщо ви використовуєте драйвер s3, цей метод поверне відносний шлях до файлу в S3 bucket:

use Illuminate\Support\Facades\Storage;
 
$path = Storage::path('file.jpg');

Зберігання файлів

Метод put може бути використаний для збереження вмісту файлу на диску. Ви також можете передати PHP resource до методу put, який використовуватиме підтримку потоків Flysystem. Пам'ятайте, всі шляхи до файлів повинні бути вказані відносно "кореневого" розташування, налаштованого для диска:

use Illuminate\Support\Facades\Storage;
 
Storage::put('file.jpg', $contents);
 
Storage::put('file.jpg', $resource);

Невдалі Записи

Якщо метод put (або інші операції "запису") не може записати файл на диск, буде повернено false:

if (! Storage::put('file.jpg', $contents)) {
// Не вдалося записати файл на диск...
}

Якщо ви бажаєте, ви можете визначити опцію throw у масиві конфігурації вашого файлового диска. Коли ця опція визначена як true, методи "запису", такі як put, будуть викидати екземпляр League\Flysystem\UnableToWriteFile, коли операції запису зазнають невдачі:

'public' => [
    'driver' => 'local',
    // ...
    'throw' => true,
],

Додавання на початок і в кінець файлів

Методи prepend та append дозволяють записувати на початок або кінець файлу:

Storage::prepend('file.log', 'Prepended Text');
 
Storage::append('file.log', 'Appended Text');

Копіювання та Переміщення Файлів

Метод copy може бути використаний для копіювання існуючого файлу в нове місце на диску, тоді як метод move може бути використаний для перейменування або переміщення існуючого файлу в нове місце:

Storage::copy('old/file.jpg', 'new/file.jpg');
 
Storage::move('old/file.jpg', 'new/file.jpg');

Автоматичне потокове передавання

Передача файлів на зберігання значно зменшує використання пам'яті. Якщо ви хочете, щоб Laravel автоматично керував передачею даного файлу до вашого місця зберігання, ви можете використовувати методи putFile або putFileAs. Цей метод приймає екземпляр Illuminate\Http\File або Illuminate\Http\UploadedFile і автоматично передасть файл до вашого бажаного місця:

use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;
 
// Автоматично згенерувати унікальний ID для імені файлу...
$path = Storage::putFile('photos', new File('/path/to/photo'));
 
// Вказати ім'я файлу вручну...
$path = Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');

Є кілька важливих моментів, на які слід звернути увагу щодо методу putFile. Зверніть увагу, що ми вказали лише ім'я директорії, а не ім'я файлу. За замовчуванням метод putFile згенерує унікальний ідентифікатор, який буде використовуватися як ім'я файлу. Розширення файлу буде визначено шляхом перевірки MIME-типу файлу. Шлях до файлу буде повернуто методом putFile, щоб ви могли зберегти шлях, включаючи згенероване ім'я файлу, у вашій базі даних.

Методи putFile та putFileAs також приймають аргумент для вказівки "видимості" збереженого файлу. Це особливо корисно, якщо ви зберігаєте файл на хмарному диску, такому як Amazon S3, і хочете, щоб файл був публічно доступним через згенеровані URL-адреси:

Storage::putFile('photos', new File('/path/to/photo'), 'public');

Завантаження файлів

У веб-застосунках одним з найпоширеніших випадків використання для зберігання файлів є зберігання файлів, завантажених користувачами, таких як фотографії та документи. Laravel робить зберігання завантажених файлів дуже простим за допомогою методу store на екземплярі завантаженого файлу. Викличте метод store з шляхом, за яким ви бажаєте зберегти завантажений файл:

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
 
class UserAvatarController extends Controller
{
/**
* Оновити аватар користувача.
*/
public function update(Request $request): string
{
$path = $request->file('avatar')->store('avatars');
 
return $path;
}
}

Є кілька важливих моментів, на які слід звернути увагу в цьому прикладі. Зверніть увагу, що ми вказали лише ім'я каталогу, а не ім'я файлу. За замовчуванням метод store згенерує унікальний ідентифікатор, який буде використовуватися як ім'я файлу. Розширення файлу буде визначено шляхом перевірки MIME-типу файлу. Шлях до файлу буде повернуто методом store, щоб ви могли зберегти шлях, включаючи згенероване ім'я файлу, у вашій базі даних.

Ви також можете викликати метод putFile на фасаді Storage, щоб виконати ту саму операцію зберігання файлів, як у наведеному вище прикладі:

$path = Storage::putFile('avatars', $request->file('avatar'));

Вказання імені файлу

Якщо ви не хочете, щоб ім'я файлу автоматично призначалося вашому збереженому файлу, ви можете використовувати метод storeAs, який приймає шлях, ім'я файлу та (необов'язковий) диск як свої аргументи:

$path = $request->file('avatar')->storeAs(
    'avatars', $request->user()->id
);

Ви також можете використовувати метод putFileAs на фасаді Storage, який виконає ту саму операцію зберігання файлу, як у наведеному вище прикладі:

$path = Storage::putFileAs(
    'avatars', $request->file('avatar'), $request->user()->id
);

Непридатні для друку та недійсні символи Unicode автоматично видалятимуться з шляхів до файлів. Тому, можливо, ви захочете очистити ваші шляхи до файлів перед тим, як передавати їх методам зберігання файлів Laravel. Шляхи до файлів нормалізуються за допомогою методу League\Flysystem\WhitespacePathNormalizer::normalizePath.

Вказування диска

За замовчуванням метод store цього завантаженого файлу використовуватиме ваш диск за замовчуванням. Якщо ви хочете вказати інший диск, передайте ім'я диска як другий аргумент методу store:

$path = $request->file('avatar')->store(
    'avatars/'.$request->user()->id, 's3'
);

Якщо ви використовуєте метод storeAs, ви можете передати ім'я диска як третій аргумент до методу:

$path = $request->file('avatar')->storeAs(
    'avatars',
    $request->user()->id,
    's3'
);

Інша інформація про завантажений файл

Якщо ви хочете отримати оригінальне ім'я та розширення завантаженого файлу, ви можете зробити це за допомогою методів getClientOriginalName та getClientOriginalExtension:

$file = $request->file('avatar');
 
$name = $file->getClientOriginalName();
$extension = $file->getClientOriginalExtension();

Однак майте на увазі, що методи getClientOriginalName та getClientOriginalExtension вважаються небезпечними, оскільки ім'я файлу та розширення можуть бути змінені зловмисником. З цієї причини зазвичай слід віддавати перевагу методам hashName та extension для отримання імені та розширення для завантаженого файлу:

$file = $request->file('avatar');
 
$name = $file->hashName(); // Згенерувати унікальне випадкове ім’я...
$extension = $file->extension(); // Визначити розширення файлу на основі його MIME-типу...

Видимість файлу

У інтеграції Flysystem в Laravel, "видимість" є абстракцією дозволів файлів на різних платформах. Файли можуть бути оголошені як public або private. Коли файл оголошено як public, ви вказуєте, що файл повинен бути загалом доступним для інших. Наприклад, при використанні драйвера S3, ви можете отримати URL-адреси для public файлів.

Ви можете встановити видимість під час запису файлу за допомогою методу put:

use Illuminate\Support\Facades\Storage;
 
Storage::put('file.jpg', $contents, 'public');

Якщо файл вже збережено, його видимість можна отримати та встановити за допомогою методів getVisibility та setVisibility:

$visibility = Storage::getVisibility('file.jpg');
 
Storage::setVisibility('file.jpg', 'public');

Коли ви взаємодієте з завантаженими файлами, ви можете використовувати методи storePublicly та storePubliclyAs для збереження завантаженого файлу з видимістю public:

$path = $request->file('avatar')->storePublicly('avatars', 's3');
 
$path = $request->file('avatar')->storePubliclyAs(
    'avatars',
    $request->user()->id,
    's3'
);

Локальні файли та видимість

Коли використовується драйвер local, public видимість перетворюється на права 0755 для директорій і права 0644 для файлів. Ви можете змінити відображення прав у файлі конфігурації filesystems вашого застосунку:

'local' => [
    'driver' => 'local',
    'root' => storage_path('app'),
    'permissions' => [
        'file' => [
            'public' => 0644,
            'private' => 0600,
        ],
        'dir' => [
            'public' => 0755,
            'private' => 0700,
        ],
    ],
    'throw' => false,
],

Видалення файлів

Метод delete приймає одне ім'я файлу або масив файлів для видалення:

use Illuminate\Support\Facades\Storage;
 
Storage::delete('file.jpg');
 
Storage::delete(['file.jpg', 'file2.jpg']);

Якщо необхідно, ви можете вказати диск, з якого файл повинен бути видалений:

use Illuminate\Support\Facades\Storage;
 
Storage::disk('s3')->delete('path/file.jpg');

Каталоги

Отримати всі файли в каталозі

Метод files повертає масив усіх файлів у заданій директорії. Якщо ви хочете отримати список усіх файлів у заданій директорії, включаючи піддиректорії, ви можете використовувати метод allFiles:

use Illuminate\Support\Facades\Storage;
 
$files = Storage::files($directory);
 
$files = Storage::allFiles($directory);

Отримати всі каталоги в межах каталогу

Метод directories повертає масив усіх директорій в межах заданої директорії. Якщо ви хочете отримати список усіх директорій в межах заданої директорії, включаючи піддиректорії, ви можете використати метод allDirectories:

$directories = Storage::directories($directory);
 
$directories = Storage::allDirectories($directory);

Створити Директорію

Метод makeDirectory створить вказану директорію, включаючи всі необхідні піддиректорії:

Storage::makeDirectory($directory);

Видалити каталог

Нарешті, метод deleteDirectory може бути використаний для видалення каталогу та всіх його файлів:

Storage::deleteDirectory($directory);

Тестування

Метод fake фасаду Storage дозволяє легко створити фейковий диск, який у поєднанні з утилітами генерації файлів класу Illuminate\Http\UploadedFile значно спрощує тестування завантаження файлів. Наприклад:

<?php
 
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
 
test('albums can be uploaded', function () {
Storage::fake('photos');
 
$response = $this->json('POST', '/photos', [
UploadedFile::fake()->image('photo1.jpg'),
UploadedFile::fake()->image('photo2.jpg')
]);
 
// Перевірити, що один або кілька файлів були збережені...
Storage::disk('photos')->assertExists('photo1.jpg');
Storage::disk('photos')->assertExists(['photo1.jpg', 'photo2.jpg']);
 
// Перевірити, що один або кілька файлів не були збережені...
Storage::disk('photos')->assertMissing('missing.jpg');
Storage::disk('photos')->assertMissing(['missing.jpg', 'non-existing.jpg']);
 
// Перевірити, що кількість файлів у вказаному каталозі відповідає очікуваній кількості...
Storage::disk('photos')->assertCount('/wallpapers', 2);
 
// Перевірити, що вказаний каталог порожній...
Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
});
<?php
 
namespace Tests\Feature;
 
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_albums_can_be_uploaded(): void
{
Storage::fake('photos');
 
$response = $this->json('POST', '/photos', [
UploadedFile::fake()->image('photo1.jpg'),
UploadedFile::fake()->image('photo2.jpg')
]);
 
// Перевірити, що один або кілька файлів були збережені...
Storage::disk('photos')->assertExists('photo1.jpg');
Storage::disk('photos')->assertExists(['photo1.jpg', 'photo2.jpg']);
 
// Перевірити, що один або кілька файлів не були збережені...
Storage::disk('photos')->assertMissing('missing.jpg');
Storage::disk('photos')->assertMissing(['missing.jpg', 'non-existing.jpg']);
 
// Перевірити, що кількість файлів у вказаному каталозі відповідає очікуваній кількості...
Storage::disk('photos')->assertCount('/wallpapers', 2);
 
// Перевірити, що вказаний каталог порожній...
Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
}
}

За замовчуванням метод fake видалить всі файли у своїй тимчасовій директорії. Якщо ви хочете зберегти ці файли, ви можете використовувати метод "persistentFake". Для отримання додаткової інформації про тестування завантажень файлів, ви можете звернутися до документації з HTTP тестування щодо завантажень файлів.

Метод image вимагає розширення GD.

Користувацькі файлові системи

Інтеграція Flysystem у Laravel забезпечує підтримку кількох "драйверів" з коробки; однак, Flysystem не обмежується цими і має адаптери для багатьох інших систем зберігання. Ви можете створити власний драйвер, якщо хочете використовувати один з цих додаткових адаптерів у вашому Laravel застосунку.

Щоб визначити власну файлову систему, вам знадобиться адаптер Flysystem. Додамо до нашого проекту адаптер Dropbox, підтримуваний спільнотою:

composer require spatie/flysystem-dropbox

Далі, ви можете зареєструвати драйвер у методі boot одного з сервіс-провайдерів вашого застосунку. Для цього слід використовувати метод extend фасаду Storage:

<?php
 
namespace App\Providers;
 
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Filesystem;
use Spatie\Dropbox\Client as DropboxClient;
use Spatie\FlysystemDropbox\DropboxAdapter;
 
class AppServiceProvider extends ServiceProvider
{
/**
* Зареєструвати будь-які сервіси застосунку.
*/
public function register(): void
{
// ...
}
 
/**
* Ініціалізувати будь-які сервіси застосунку.
*/
public function boot(): void
{
Storage::extend('dropbox', function (Application $app, array $config) {
$adapter = new DropboxAdapter(new DropboxClient(
$config['authorization_token']
));
 
return new FilesystemAdapter(
new Filesystem($adapter, $config),
$adapter,
$config
);
});
}
}

Перший аргумент методу extend — це назва драйвера, а другий — це замикання, яке отримує змінні $app і $config. Замикання повинно повертати екземпляр Illuminate\Filesystem\FilesystemAdapter. Змінна $config містить значення, визначені в config/filesystems.php для вказаного диска.

Після того як ви створили та зареєстрували сервіс-провайдер розширення, ви можете використовувати драйвер dropbox у вашому конфігураційному файлі config/filesystems.php.