Файлове сховище · Laravel
Вступ
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
Коли ви використовуєте драйвер local, усі файлові операції відлічуються відносно директорії root, визначеної у конфігураційному файлі filesystems. За замовчуванням це значення - директорія storage/app/private. Отже, наведений нижче метод запише у storage/app/private/example.txt:
use Illuminate\Support\Facades\Storage;
Storage::disk('local')->put('example.txt', 'Contents');
Диск public
Диск 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:
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:
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'),
// Необовʼязкові налаштування FTP...
// 'port' => env('FTP_PORT', 21),
// 'root' => env('FTP_ROOT'),
// 'passive' => true,
// 'ssl' => true,
// 'timeout' => 30,
],
Конфігурація драйвера SFTP
Перш ніж використовувати драйвер SFTP, установіть пакет Flysystem SFTP через менеджер пакетів Composer:
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,
],
Обмежені, лише для читання та read-through файлові системи
Обмежені (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:
composer require league/flysystem-read-only "^3.0"
Далі додайте опцію конфігурації read-only в один або кілька масивів конфігурації дисків:
's3-videos' => [
'driver' => 's3',
// ...
'read-only' => true,
],
Read-through диски дають змогу мігрувати файли між дисками без простою. Читаючи файл, Laravel спершу перевіряє основний диск. Якщо файл існує лише на резервному диску, Laravel читає файл із резервного диска й копіює його на основний для наступних запитів:
'assets' => [
'driver' => 'read-through',
'primary' => 's3',
'fallback' => 'legacy-s3',
],
Записи та отримання списку вмісту директорій адресуються до основного диска. Перевірки існування файлу та метаданих використовують будь-який із дисків без копіювання файлів на основний. Якщо копіювання файлу з резервного диска на основний не вдалося, читання за замовчуванням усе одно виконується успішно. Щоб натомість викидався виняток, установіть опцію конфігурації throw_on_promotion_failure у true.
Файлові системи, сумісні з Amazon S3
За замовчуванням конфігураційний файл filesystems вашого застосунку містить конфігурацію диска s3. Окрім роботи з Amazon S3, цей диск можна використовувати з будь-яким S3-сумісним сервісом зберігання файлів, наприклад RustFS, DigitalOcean Spaces, Vultr Object Storage, Cloudflare R2 або Hetzner Cloud Storage.
Зазвичай, оновивши облікові дані диска відповідно до сервісу, який ви плануєте використовувати, потрібно лише змінити значення опції конфігурації endpoint. Значення цієї опції зазвичай задається через змінну оточення AWS_ENDPOINT:
'endpoint' => env('AWS_ENDPOINT', 'https://rustfs:9000'),
Отримання екземплярів диска
Фасад 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()->plus(minutes: 5)
);
Увімкнення тимчасових URL для local
Якщо ви почали розробляти застосунок до того, як підтримку тимчасових URL додали до драйвера local, можливо, вам доведеться увімкнути локальні тимчасові URL. Для цього додайте опцію serve до масиву конфігурації диска local у файлі config/filesystems.php:
'local' => [
'driver' => 'local',
'root' => storage_path('app/private'),
'serve' => true, // [tl! add]
'throw' => false,
],
Параметри запиту S3
Якщо вам потрібно вказати додаткові параметри запиту S3, передайте масив цих параметрів третім аргументом методу temporaryUrl:
$url = Storage::temporaryUrl(
'file.jpg',
now()->plus(minutes: 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
{
/**
* Bootstrap any application services.
*/
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таlocal.
Якщо вам потрібно згенерувати тимчасовий URL, через який можна завантажити файл напряму з клієнтського застосунку, скористайтеся методом temporaryUploadUrl. Метод приймає шлях і екземпляр DateTime, що вказує, коли URL має закінчити дію. Метод temporaryUploadUrl повертає асоціативний масив, який можна розібрати на URL завантаження та заголовки, які слід додати до запиту:
use Illuminate\Support\Facades\Storage;
['url' => $url, 'headers' => $headers] = Storage::temporaryUploadUrl(
'file.jpg', now()->plus(minutes: 5)
);
Цей метод передусім корисний у serverless-середовищах, де клієнтський застосунок має завантажувати файли напряму в хмарне сховище на кшталт 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:
use Illuminate\Support\Facades\Storage;
$path = Storage::path('file.jpg');
Збереження файлів
Метод put зберігає вміст файлу на диску. Також методу put можна передати PHP-resource, і тоді буде задіяно підтримку потоків у 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 генерує унікальний ID, який слугує імʼям файлу. Розширення файлу визначається за його 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
{
/**
* Update the avatar for the user.
*/
public function update(Request $request): string
{
$path = $request->file('avatar')->store('avatars');
return $path;
}
}
Щодо цього прикладу є кілька важливих моментів. Зверніть увагу, що ми вказали лише імʼя директорії, а не імʼя файлу. За замовчуванням метод store генерує унікальний ID, який слугує імʼям файлу. Розширення файлу визначається за його 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-типом...
Видимість файлів
В інтеграції Laravel із Flysystem «видимість» - це абстракція прав доступу до файлів на різних платформах. Файли можна оголосити 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'
);
Обробка зображень
Якщо перед збереженням потрібно змінити розмір, обрізати чи конвертувати завантажене зображення, скористайтеся можливостями обробки зображень Laravel:
$path = $request->image('avatar')
->cover(400, 400)
->toWebp()
->storePublicly('avatars', 'public');
Також можна створити екземпляр зображення з файлу, який уже зберігається на одному з ваших дисків:
$image = Storage::disk('public')->image('avatars/photo.jpg');
Локальні файли та видимість
З драйвером 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');
// Перевірити, що диск не містить файлів...
Storage::disk('photos')->assertEmpty();
});
<?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');
// Перевірити, що диск не містить файлів...
Storage::disk('photos')->assertEmpty();
}
}
За замовчуванням метод fake видаляє всі файли у своїй тимчасовій директорії. Якщо ви хочете зберегти ці файли, використовуйте натомість метод persistentFake. Докладніше про тестування завантаження файлів читайте в документації з тестування HTTP, розділ про завантаження файлів.
Увага Метод
imageпотребує розширення GD.
Власні файлові системи
Інтеграція Laravel із Flysystem з коробки підтримує кілька «драйверів», проте 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
{
/**
* Register any application services.
*/
public function register(): void
{
// ...
}
/**
* Bootstrap any application services.
*/
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.
Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.