メインコンテンツまでスキップ

ファイルストレージ

はじめに

Laravelは、Frank de Jongeによる素晴らしい Flysystem PHPパッケージによって強力なファイルシステム抽象化を提供しています。Laravel Flysystem 統合により、ローカルファイルシステム、SFTP、Amazon S3 などと簡単に連携できるドライバが提供されます。さらに、API は各システムごとに同じままなので、開発環境と本番サーバー間でこれらのストレージオプションを簡単に切り替えることができます。

構成

Laravelのファイルシステム構成ファイルは config/filesystems.php にあります。このファイルでは、すべてのファイルシステム "ディスク" を構成できます。各ディスクは特定のストレージドライバとストレージ場所を表します。サポートされている各ドライバの例の構成が構成ファイルに含まれているため、構成を変更してストレージの設定や資格情報を反映させることができます。

local ドライバは、Laravelアプリケーションを実行しているサーバー上にローカルに保存されたファイルとやり取りします。一方、s3 ドライバは、AmazonのS3クラウドストレージサービスに書き込むために使用されます。

注記

お好きなだけディスクを構成でき、同じドライバを使用する複数のディスクを持つこともできます。

ローカルドライバ

local ドライバを使用すると、すべてのファイル操作は filesystems 構成ファイルで定義された root ディレクトリを基準とします。デフォルトでは、この値は storage/app ディレクトリに設定されています。したがって、次のメソッドは storage/app/example.txt に書き込まれます:

    use Illuminate\Support\Facades\Storage;

Storage::disk('local')->put('example.txt', 'Contents');

パブリックディスク

アプリケーションの filesystems 構成ファイルに含まれる public ディスクは、一般公開されるファイル用です。デフォルトでは、public ディスクは local ドライバを使用し、ファイルを storage/app/public に保存します。

これらのファイルをウェブからアクセス可能にするには、public/storage から storage/app/public へのシンボリックリンクを作成する必要があります。このフォルダ構造を利用すると、Envoyer のようなゼロダウンタイムデプロイメントシステムを使用する際に、簡単に共有できる1つのディレクトリに一般公開ファイルを保持できます。

シンボリックリンクを作成するには、storage:link Artisan コマンドを使用できます:

php artisan storage:link

ファイルが保存され、シンボリックリンクが作成されたら、asset ヘルパーを使用してファイルへのURLを作成できます:

    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 ドライバを使用する前に、Composer パッケージマネージャを介して Flysystem S3 パッケージをインストールする必要があります:

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

S3 ディスクの構成配列は、config/filesystems.php 構成ファイルにあります。通常、config/filesystems.php 構成ファイルで参照される環境変数を使用して、S3 の情報と資格情報を構成する必要があります。

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 ドライバーを使用する前に、Composer パッケージマネージャーを介して 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'),

// Optional FTP Settings...
// 'port' => env('FTP_PORT', 21),
// 'root' => env('FTP_ROOT'),
// 'passive' => true,
// 'ssl' => true,
// 'timeout' => 30,
],

SFTP ドライバーの設定

SFTP ドライバーを使用する前に、Composer パッケージマネージャーを介して Flysystem SFTP パッケージをインストールする必要があります:

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

Laravel の Flysystem 統合は SFTP と非常にうまく動作しますが、フレームワークのデフォルトの config/filesystems.php 設定ファイルにはサンプル構成が含まれていません。SFTP ファイルシステムを構成する必要がある場合は、以下の構成例を使用できます:

    'sftp' => [
'driver' => 'sftp',
'host' => env('SFTP_HOST'),

// Settings for basic authentication...
'username' => env('SFTP_USERNAME'),
'password' => env('SFTP_PASSWORD'),

// Settings for SSH key based authentication with encryption password...
'privateKey' => env('SFTP_PRIVATE_KEY'),
'passphrase' => env('SFTP_PASSPHRASE'),

// Settings for file / directory permissions...
'visibility' => 'private', // `private` = 0600, `public` = 0644
'directory_visibility' => 'private', // `private` = 0700, `public` = 0755

// Optional SFTP Settings...
// 'hostFingerprint' => env('SFTP_HOST_FINGERPRINT'),
// 'maxTries' => 4,
// 'passphrase' => env('SFTP_PASSPHRASE'),
// 'port' => env('SFTP_PORT', 22),
// 'root' => env('SFTP_ROOT', ''),
// 'timeout' => 30,
// 'useAgent' => true,
],

スコープ付きおよび読み取り専用ファイルシステム

スコープ付きディスクを使用すると、すべてのパスが指定されたパス接頭辞で自動的に接頭辞付けられるファイルシステムを定義できます。スコープ付きファイルシステムディスクを作成する前に、Composer パッケージマネージャーを介して追加の Flysystem パッケージをインストールする必要があります:

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

既存のファイルシステムディスクのパススコープインスタンスを作成するには、scoped ドライバーを利用するディスクを定義します。たとえば、既存の s3 ディスクを特定のパス接頭辞にスコープ化するディスクを作成し、その後、スコープ付きディスクを使用してのすべてのファイル操作は指定された接頭辞を利用します:

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

"読み取り専用" ディスクを使用すると、書き込み操作を許可しないファイルシステムディスクを作成できます。read-only 構成オプションを使用する前に、Composer パッケージマネージャーを介して追加の Flysystem パッケージをインストールする必要があります:

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

次に、ディスクの構成配列の1つ以上に read-only 構成オプションを含めることができます:

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

Amazon S3 互換ファイルシステム

デフォルトでは、アプリケーションの filesystems 構成ファイルには s3 ディスクのディスク構成が含まれています。このディスクを Amazon S3 とやり取りするためだけでなく、MinIODigitalOcean Spaces などの S3 互換ファイルストレージサービスとやり取りするためにも使用できます。

通常、サービスの資格情報を使用するサービスの資格情報に一致するようにディスクの資格情報を更新した後、endpoint 構成オプションの値を更新する必要があります。このオプションの値は通常、AWS_ENDPOINT 環境変数を介して定義されます:

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

MinIO

MinIO を使用する場合、Laravel の Flysystem 統合が適切な URL を生成するために、AWS_URL 環境変数を定義して、アプリケーションのローカル URL に一致し、URL パスにバケット名を含める必要があります:

AWS_URL=http://localhost:9000/local
警告

MinIO を使用する場合、temporaryUrl メソッドを介して一時的なストレージ URL を生成することはサポートされていません。

ディスクインスタンスの取得

Storage ファサードを使用して構成されたディスクのいずれかとやり取りすることができます。たとえば、ファサード上の put メソッドを使用して、デフォルトのディスクにアバターを保存することができます。Storage ファサード上でメソッドを呼び出す際に disk メソッドを最初に呼び出さない場合、メソッドは自動的にデフォルトのディスクに渡されます:

    use Illuminate\Support\Facades\Storage;

Storage::put('avatars/1', $content);

アプリケーションが複数のディスクとやり取りする場合、Storage ファサード上の disk メソッドを使用して特定のディスク上のファイルを操作できます:

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

オンデマンドディスク

時々、アプリケーションの filesystems 構成ファイルに実際にその構成が存在しない状態で、与えられた構成を使用してランタイムでディスクを作成したい場合があります。これを実現するために、Storage ファサードの build メソッドに構成配列を渡すことができます:

use Illuminate\Support\Facades\Storage;

$disk = Storage::build([
'driver' => 'local',
'root' => '/path/to/root',
]);

$disk->put('image.jpg', $content);

ファイルの取得

get メソッドを使用してファイルの内容を取得することができます。ファイルの生の文字列内容がメソッドによって返されます。すべてのファイルパスはディスクの "root" 位置を基準に指定する必要があります。

    $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/storagestorage/app/public ディレクトリを指す シンボリックリンク を作成する必要があります。

警告

local ドライバを使用する場合、url の戻り値は URL エンコードされません。そのため、常に有効な URL を作成する名前でファイルを保存することをお勧めします。

URL ホストのカスタマイズ

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

一時的なURL

Storage ファサードを使用して生成される URL のホストを変更したい場合は、ディスクの構成配列内の url オプションを追加または変更できます。

    use Illuminate\Support\Facades\Storage;

$url = Storage::temporaryUrl(
'file.jpg', now()->addMinutes(5)
);

temporaryUrl メソッドを使用すると、s3 ドライバーを使用して保存されたファイルに対して一時的な URL を作成できます。このメソッドは、URL が期限切れになる日時を指定するパスと DateTime インスタンスを受け入れます。

    $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
{
/**
* 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 ドライバーのみでサポートされています。

クライアントサイドアプリケーションから直接ファイルをアップロードするために使用できる一時的な URL を生成する必要がある場合は、temporaryUploadUrl メソッドを使用できます。このメソッドは、URL が期限切れになる日時を指定するパスと DateTime インスタンスを受け入れます。temporaryUploadUrl メソッドは、アップロード URL とアップロードリクエストに含めるべきヘッダーを含む連想配列を返します。

    use Illuminate\Support\Facades\Storage;

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

このメソッドは、クライアントサイドアプリケーションが直接ファイルを Amazon S3 などのクラウドストレージシステムにアップロードする必要があるサーバーレス環境で主に有用です。

ファイルのメタデータ

ファイルの読み取りと書き込みに加えて、Laravel はファイル自体に関する情報も提供できます。たとえば、size メソッドを使用してファイルのサイズ(バイト単位)を取得できます。


```php
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)) {
// The file could not be written to disk...
}

必要であれば、ファイルシステムディスクの構成配列内で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;

// Automatically generate a unique ID for filename...
$path = Storage::putFile('photos', new File('/path/to/photo'));

// Manually specify a filename...
$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');

ファイルのアップロード

Web アプリケーションにおいて、ファイルを保存する最も一般的なユースケースの1つは、写真やドキュメントなどのユーザーがアップロードしたファイルを保存することです。Laravel では、アップロードされたファイルを保存するのが非常に簡単で、アップロードされたファイルインスタンスの store メソッドを使用します。アップロードされたファイルを保存したいパスを指定して store メソッドを呼び出します。

    <?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
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 メソッドによって返されるため、生成されたファイル名を含むパスをデータベースに保存できます。

また、Storage ファサード上で putFile メソッドを呼び出すことで、上記の例と同じファイル保存操作を実行することもできます。

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

ファイル名の指定

保存されたファイルに自動的にファイル名を割り当てたくない場合は、引数としてパス、ファイル名、および(オプションの)ディスクを受け取る storeAs メソッドを使用できます。

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

また、Storage ファサード上で putFileAs メソッドを使用することもでき、上記の例と同じファイル保存操作を実行します。

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

警告

ファイルパスから印刷できない無効なUnicode文字は自動的に削除されます。したがって、Laravelのファイルストレージメソッドに渡す前にファイルパスをサニタイズすることをお勧めします。ファイルパスは League\Flysystem\WhitespacePathNormalizer::normalizePath メソッドを使用して正規化されます。

ディスクの指定

デフォルトでは、このアップロードされたファイルの store メソッドはデフォルトディスクを使用します。別のディスクを指定したい場合は、store メソッドの第2引数としてディスク名を渡します:

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

storeAs メソッドを使用している場合は、メソッドの第3引数としてディスク名を渡すことができます:

    $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ドライバを使用している場合、public ファイルのURLを取得できます。

ファイルを書き込む際に可視性を設定することができます:

    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);

テスト

Storageファサードのfakeメソッドを使用すると、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')
]);

// Assert one or more files were stored...
Storage::disk('photos')->assertExists('photo1.jpg');
Storage::disk('photos')->assertExists(['photo1.jpg', 'photo2.jpg']);

// Assert one or more files were not stored...
Storage::disk('photos')->assertMissing('missing.jpg');
Storage::disk('photos')->assertMissing(['missing.jpg', 'non-existing.jpg']);

// Assert that a given directory is empty...
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')
]);

// Assert one or more files were stored...
Storage::disk('photos')->assertExists('photo1.jpg');
Storage::disk('photos')->assertExists(['photo1.jpg', 'photo2.jpg']);

// Assert one or more files were not stored...
Storage::disk('photos')->assertMissing('missing.jpg');
Storage::disk('photos')->assertMissing(['missing.jpg', 'non-existing.jpg']);

// Assert that a given directory is empty...
Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
}
}

デフォルトでは、fakeメソッドは一時ディレクトリ内のすべてのファイルを削除します。これらのファイルを保持したい場合は、代わりに "persistentFake" メソッドを使用できます。ファイルアップロードのテストに関する詳細は、HTTPテストドキュメントのファイルアップロードに関する情報を参照してください。

警告

imageメソッドを使用するには、GD拡張機能が必要です。

カスタムファイルシステム

LaravelのFlysystem統合では、いくつかの「ドライバー」をデフォルトでサポートしていますが、Flysystemはこれらに限定されず、多くの他のストレージシステム用のアダプターを持っています。Laravelアプリケーションでこれらの追加のアダプターの1つを使用したい場合は、カスタムドライバーを作成できます。

カスタムファイルシステムを定義するには、Flysystemアダプターが必要です。プロジェクトにコミュニティが維持しているDropboxアダプターを追加しましょう:

composer require spatie/flysystem-dropbox

次に、Storageファサードのextendメソッドを使用して、アプリケーションのサービスプロバイダーbootメソッド内でドライバーを登録できます。これを達成するためには、extendメソッドを使用する必要があります:

    <?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メソッドの最初の引数はドライバーの名前であり、2番目は$app$config変数を受け取るクロージャです。クロージャはIlluminate\Filesystem\FilesystemAdapterのインスタンスを返さなければなりません。$config変数には、指定されたディスクのconfig/filesystems.phpで定義された値が含まれています。

拡張のサービスプロバイダーを作成して登録したら、config/filesystems.php構成ファイルでdropboxドライバーを使用できます。