Skip to content

ファイルストレージ

はじめに

Laravelは、Frank de Jongeによる優れたFlysystem PHPパッケージのおかげで、強力なファイルシステムの抽象化を提供しています。Laravel Flysystemの統合により、ローカルファイルシステム、SFTP、Amazon S3を操作するためのシンプルなドライバが提供されます。さらに良いことに、ローカルの開発マシンと本番サーバーの間でこれらのストレージオプションを切り替えるのは驚くほど簡単で、APIはどのシステムでも同じままです。

設定

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

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

Note

必要な数のディスkを設定でき、同じドライバを使用する複数のディスクを持つこともできます。

ローカルドライバ

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に保存します。

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

シンボリックリンクを作成するには、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設定ファイルにあります。通常、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ドライバを使用する前に、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

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

AWS_URL=http://localhost:9000/local

Warning

temporaryUrlメソッドを使用して一時的なストレージURLを生成することは、endpointがクライアントからアクセスできない場合、MinIOでは機能しない可能性があります。

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

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メソッドを使用して、ファイルの内容を取得できます。ファイルの生の文字列内容がメソッドによって返されます。すべてのファイルパスは、ディスクの「ルート」位置を基準に指定する必要があることに注意してください。

$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メソッドは、メソッドの第2引数としてファイル名を受け取り、ユーザーがファイルをダウンロードする際に表示されるファイル名を決定します。最後に、メソッドの第3引数として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ディレクトリに配置する必要があります。さらに、storage/app/publicディレクトリを指すpublic/storageシンボリックリンクを作成する必要があります。

Warning

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

URLホストのカスタマイズ

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

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

一時的なURL

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

use Illuminate\Support\Facades\Storage;

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

ローカル一時URLの有効化

一時URLのサポートがlocalドライバに導入される前にアプリケーションの開発を開始した場合、ローカル一時URLを有効にする必要があるかもしれません。そのためには、config/filesystems.php設定ファイル内のlocalディスクの設定配列にserveオプションを追加します。

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

S3リクエストパラメータ

追加のS3リクエストパラメータを指定する必要がある場合、リクエストパラメータの配列をtemporaryUrlメソッドの第3引数として渡すことができます。

$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
{
    /**
     * 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

Warning

一時アップロード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メソッドを使用して、ファイルのサイズをバイト単位で取得できます。

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のresourceputメソッドに渡すこともでき、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');

ファイルアップロード

Webアプリケーションでファイルを保存する最も一般的なユースケースの1つは、写真やドキュメントなどのユーザーがアップロードしたファイルを保存することです。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メソッドは一意の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
);

Warning

印刷不可能な文字と無効なユニコード文字は、ファイルパスから自動的に削除されます。したがって、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(); // 一意でランダムな名前を生成...
$extension = $file->extension(); // ファイルのMIMEタイプに基づいてファイルの拡張子を決定...

ファイルの可視性

LaravelのFlysystem統合では、「可視性」は複数のプラットフォーム間でのファイル権限を抽象化したものです。ファイルはpublicまたはprivateとして宣言できます。ファイルがpublicと宣言されている場合、通常は他のユーザーがファイルにアクセスできることを示します。たとえば、S3ドライバーを使用する場合、publicファイルのURLを取得できます。

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

テスト

Storageファサードのfakeメソッドを使用すると、簡単に偽のディスクを生成できます。これは、Illuminate\Http\UploadedFileクラスのファイル生成ユーティリティと組み合わせることで、ファイルアップロードのテストが大幅に簡素化されます。例えば:

<?php

use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;

test('アルバムをアップロードできる', function () {
    Storage::fake('photos');

    $response = $this->json('POST', '/photos', [
        UploadedFile::fake()->image('photo1.jpg'),
        UploadedFile::fake()->image('photo2.jpg')
    ]);

    // アップロードされたファイルのアサーション...
});
<?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')
        ]);

        // 1つ以上のファイルが保存されたことをアサート...
        Storage::disk('photos')->assertExists('photo1.jpg');
        Storage::disk('photos')->assertExists(['photo1.jpg', 'photo2.jpg']);

        // 1つ以上のファイルが保存されていないことをアサート...
        Storage::disk('photos')->assertMissing('missing.jpg');
        Storage::disk('photos')->assertMissing(['missing.jpg', 'non-existing.jpg']);

        // 指定されたディレクトリが空であることをアサート...
        Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
    }
}

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

Warning

imageメソッドはGD拡張機能を必要とします。

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

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

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

composer require spatie/flysystem-dropbox

次に、アプリケーションのサービスプロバイダbootメソッド内でドライバを登録できます。これを行うには、Storageファサードの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
{
    /**
     * 任意のアプリケーションサービスを登録します。
     */
    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メソッドの最初の引数はドライバの名前で、2番目の引数は$app$config変数を受け取るクロージャです。クロージャはIlluminate\Filesystem\FilesystemAdapterのインスタンスを返す必要があります。$config変数には、指定されたディスクのconfig/filesystems.phpで定義された値が含まれます。

拡張機能のサービスプロバイダを作成して登録したら、config/filesystems.php設定ファイルでdropboxドライバを使用できるようになります。

ユーザーノート