1. Глубже в детали
  2. Хранение файлов

Присоединяйся к нашему Telegram сообществу @webblend!

Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.

Введение

Laravel предоставляет мощную абстракцию файловой системы благодаря замечательному пакету PHP Flysystem Франка де Йонга. Интеграция Laravel Flysystem предоставляет простые драйверы для работы с локальными файловыми системами, SFTP и Amazon S3. И, что еще лучше, невероятно легко переключаться между этими вариантами хранения между вашим локальным рабочим столом и сервером продакшена, поскольку API остается одинаковым для каждой системы.

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

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

Драйвер local взаимодействует с файлами, хранящимися локально на сервере, на котором работает приложение Laravel, в то время как драйвер s3 используется для записи в облачное хранилище Amazon S3.

Примечание Вы можете настроить столько дисков, сколько вам нужно, и даже иметь несколько дисков, использующих один и тот же драйвер.

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

При использовании драйвера local все операции с файлами относятся к каталогу root, определенному в вашем файле конфигурации filesystems. По умолчанию это значение установлено в каталог storage/app. Таким образом, следующий метод записи будет производиться в storage/app/example.txt:

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

Общедоступный диск

Диск public, включенный в файл конфигурации filesystems вашего приложения, предназначен для файлов, которые будут общедоступными. По умолчанию диск public использует драйвер local и хранит файлы в storage/app/public.

Чтобы сделать эти файлы доступными из Интернета, вы должны создать символическую ссылку от public/storage к storage/app/public. Использование этой конвенции папок сохранит ваши общедоступные файлы в одном каталоге, который легко обмениваться между развертываниями, при использовании систем развертывания с нулевым временем простоя, такими как Envoyer.

Чтобы создать символическую ссылку, вы можете использовать команду 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'),
],

Предварительные требования для драйвера

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

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

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

Информация о конфигурации драйвера S3 находится в вашем файле конфигурации config/filesystems.php. Этот файл содержит массив конфигурации примера для драйвера S3. Вы можете свободно изменять этот массив своей собственной конфигурацией и учетными данными S3. Для удобства эти переменные окружения соответствуют соглашению об именах, используемому AWS CLI.

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

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

composer require league/flysystem-ftp "^3.0"

Интеграция Laravel с Flysystem прекрасно работает с FTP; однако образец конфигурации не включен в файл конфигурации 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"

Интеграция Flysystem в Laravel прекрасно работает с SFTP; однако образец конфигурации не включен в конфигурационный файл 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,
],

Файловые системы с ограниченным доступом и только для чтения

Облачные диски позволяют вам определить файловую систему, где все пути автоматически предваряются заданным префиксом пути. Прежде чем создавать облачный файловый диск, вам нужно установить дополнительный пакет 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,
],

Файловые системы, совместимые с Amazon S3

По умолчанию файловая система вашего приложения содержит конфигурацию диска для диска s3. Кроме использования этого диска для взаимодействия с Amazon S3, вы можете использовать его для взаимодействия с любым совместимым с S3 службой хранения файлов, такой как MinIO или DigitalOcean Spaces.

Обычно, после обновления учетных данных диска, чтобы соответствовать учетным данным службы, которую вы собираетесь использовать, вам нужно только обновить значение конфигурационной опции 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.

Получение экземпляров дисков

Фасад 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',
],

Временные URL-адреса

С использованием метода temporaryUrl вы можете создавать временные URL-адреса для файлов, хранящихся с использованием драйвера s3. Этот метод принимает путь и экземпляр DateTime, указывающий, когда URL-адрес должен истечь:

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

Если вам нужно указать дополнительные параметры запроса S3, вы можете передать массив параметров запроса в качестве третьего аргумента методу temporaryUrl:

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

Если вам нужно настроить способ создания временных 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:

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

Хранение файлов

Метод put можно использовать для сохранения содержимого файла на диске. Вы также можете передать ресурс PHP в метод 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;
 
// Автоматически генерировать уникальный идентификатор для имени файла...
$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 App\Http\Controllers\Controller;
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(); // Generate a unique, random name...
$extension = $file->extension(); // Determine the file's extension based on the file's MIME type...

Видимость файлов

В интеграции 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'
);

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

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

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

Удаление файлов

Метод 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
 
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')->assertDirectoryEmpty('/wallpapers');
}
}

По умолчанию метод 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
{
/**
* Зарегистрировать любые службы приложения.
*/
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.