コンテンツにスキップ

ファイルストレージ

はじめに

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

設定

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

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

lightbulb

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

ローカルドライバ

`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`へのシンボリックリンクを作成する必要があります。このフォルダの規則を利用することで、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

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

AWS_URL=http://localhost:9000/local
exclamation

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

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

`Storage`ファサードは、設定済みのディスクと対話するために使用できます。たとえば、ファサードの`put`メソッドを使用して、デフォルトディスクにアバターを保存できます。 `disk`メソッドを最初に呼び出さずに`Storage`ファサードでメソッドを呼び出すと、メソッドは自動的にデフォルトディスクに渡されます。

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`にシンボリックリンクを作成する必要があります。

exclamation

`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の有効化

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

'local' => [
'driver' => 'local',
'root' => storage_path('app/private'),
'serve' => true,
'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

exclamation

一時アップロード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の`resource`を`put`メソッドに渡すこともできます。これは、Flysystemの基盤となるストリームサポートを使用します。すべてのファイルパスは、ディスクに設定されている「ルート」の場所からの相対パスで指定する必要があることに注意してください。

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

書き込み失敗

`put`メソッド(またはその他の「書き込み」操作)がファイルをディスクに書き込めない場合、`false`が返されます。

if (! Storage::put('file.jpg', $contents)) {
// 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
);
exclamation

印刷不可能な文字と無効な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を取得できます。

`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('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 the number of files in a given directory matches the expected count...
Storage::disk('photos')->assertCount('/wallpapers', 2);
 
// 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 the number of files in a given directory matches the expected count...
Storage::disk('photos')->assertCount('/wallpapers', 2);
 
// Assert that a given directory is empty...
Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
}
}

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

exclamation

image メソッドには、GD拡張が必要です。

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

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

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

composer require spatie/flysystem-dropbox

次に、アプリケーションのサービスプロバイダの1つの 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
{
/**
* 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 ドライバを使用できます。