Lang x Lang

File Storage

Table of Contents

Introduction

Laravel は、Frank de Jonge 氏によるFlysystem PHP パッケージのおかげで強力なファイルシステムの抽象化を提供しています。Laravel の Flysystem 統合は、ローカルのファイルシステム、SFTP、Amazon S3 と連携するためのシンプルな drivers を提供しています。さらに優れているのは、これらの storageoptions をローカルの development マシンと productionserver 間で切り替えることが驚くほど簡単で、各システムで API が同じままであることです。

Configuration

Laravel のファイルシステムの設定ファイルは、config/filesystems.phpに位置しています。このファイル内で、あなたはすべてのファイルシステムの disks を設定することができます。各ディスクは特定の storage driver および storage ロケーションを表します。サポートされている各 driver の例の設定が設定ファイルに含まれているため、あなたの storage の環境や authentication 情報を反映させるために設定を変更することができます。

local driver は、Laravel application を実行しているサーバー上にローカルに保存されたファイルと対話し、s3 driver は Amazon の S3 クラウド storage service に書き込むために使用されます。

NOTE

お好きなだけディスクを設定することができ、同じ driver を使用する複数のディスクを持つことも可能です。

地元の Driver

local driver を使用すると、すべてのファイル操作はfilesystems設定ファイルで定義されたrootディレクトリに対して相対的になります。 default では、この value はstorage/appディレクトリに設定されています。したがって、次の method はstorage/app/example.txtに書き込みます:

use Illuminate\Support\Facades\Storage;

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

Public ディスク

あなたのアプリケーションの filesystems 設定ファイルに含まれる public ディスクは、一般公開される予定のファイル用です。 default では、public ディスクは local driver を使用し、そのファイルは storage/app/public に保存されます。

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

シンボリックリンクを作成するためには、storage:link Artisan command を使用できます:

php artisan storage:link

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

echo asset('storage/file.txt');

あなたのfilesystems設定ファイルで追加の象徴的な links を設定することができます。設定された各 links は、storage:link command を実行したときに作成されます。

'links' => [
    public_path('storage') => storage_path('app/public'),
    public_path('images') => storage_path('app/images'),
],

storage:unlink command は、設定したシンボリック links を破壊するために使用することができます:

php artisan storage:unlink

Driver Prerequisites

S3 Driver 設定

S3 の driver を使用する前に、 Composer パッケージマネージャーを通じて Flysystem S3 パッケージをインストールする必要があります:

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

以下の英語テキストを日本語に翻訳してください。またはで囲まれた単語やフレーズは翻訳せず、元の英語で出力します。Markdown 構造を保持し、翻訳結果のみを出力します。: S3 ディスクの設定 array は、あなたのconfig/filesystems.php設定ファイルに位置しています。一般的には、以下の environment variables を使用して 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

便宜上、これらの environment 変数は AWS CLI で使用される命名規約と match します。

FTP Driver 設定

FTP の driver を使用する前に、 Composer パッケージマネージャーで Flysystem FTP パッケージをインストールする必要があります。

composer require league/flysystem-ftp "^3.0"

Laravel の Flysystem インテグレーションは FTP と非常によく連携しますが、config/filesystems.phpのフレームワークの default 設定ファイルにはサンプルの設定が含まれていません。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 Driver 設定

SFTP の driver を使用する前に、 Composer パッケージマネージャー経由で Flysystem SFTP パッケージをインストールする必要があります:

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

Laravel の Flysystem の統合は SFTP と非常によく連携して動作します。しかし、フレームワークの default の 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,
],

スコープ指定と読み取り尽くしの Filesystems

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

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

scopedという driver を利用してディスクを定義することで、既存のファイルシステムディスクの任意の path スコープのインスタンスを作成することができます。例えば、既存のs3ディスクを特定の path プレフィックスにスコープするディスクを作成し、そのスコープされたディスクを使ってファイル操作を行うと、指定したプレフィックスが利用されます。

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

"Read-only"ディスクは、書き込み操作を許可しないファイルシステムディスクを作成できるようにします。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

default では、アプリケーションのfilesystems設定ファイルには、s3ディスクのディスク設定が含まれています。このディスクを使用して Amazon S3 と対話するほか、MinIO DigitalOcean Spaces など、S3 互換の file storage service と対話するためにも使用できます。

通常、ディスクの資格情報を予定している service の資格情報と match させた後、あなたがするべきことは endpoint 設定オプションの value を update するだけです。このオプションの value は、通常 AWS_ENDPOINT environment 変数を介して定義されます。

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

MinIO

MinIO を使用している際に Laravel の Flysystem 統合が適切な URL を生成するためには、AWS_URL 環境 variable を定義して、それが application のローカルの URL に一致し、URL パス にバケット名が含まれるようにするべきです:

AWS_URL=http://localhost:9000/local

WARNING

MinIO を使用している場合、temporaryUrl method を通じて一時的な storage URL を生成することはサポートされていません。

Obtaining Disk Instances

Storageの facade は、設定したディスクとやり取りするために使用できます。たとえば、 facade 上でput method を使用して、 default ディスクにアバターを保存することができます。Storage facade 上のメソッドを呼び出す際に、最初にdisk method を呼び出さない場合、その method は自動的に default ディスクに渡されます。

use Illuminate\Support\Facades\Storage;

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

あなたの application が複数のディスクと対話する場合、特定のディスク上のファイルを操作するために、Storageの facade にdiskの method を使用することができます:

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

オンデマンドディスク

時々、指定された設定を使用してディスクを runtime で作成したい場合があるかもしれませんが、その設定が実際にはアプリケーションのfilesystems設定ファイルに存在していないかもしれません。これを達成するためには、 array をStorageファサードのbuild method に渡すことができます。

use Illuminate\Support\Facades\Storage;

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

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

Retrieving Files

get method は、ファイルの内容を取得するために使用することができます。この method によって、ファイルの生の string 内容が返されます。すべてのファイル paths は、ディスクの "root" 位置に対して相対的に指定する必要があることを覚えておいてください:

$contents = Storage::get('file.jpg');

あなたが取得しているファイルが JSON を含んでいる場合、json method を使用してファイルを取得し、その内容をデコードすることができます:

$orders = Storage::json('orders.json');

exists method は、ディスク上にファイルが存在するかどうかを判断するために使用することができます:

if (Storage::disk('s3')->exists('file.jpg')) {
    // ...
}

missing method は、ディスクからファイルが欠落しているかどうかを判断するために使用できます:

if (Storage::disk('s3')->missing('file.jpg')) {
    // ...
}

ファイルのダウンロード

download method は、指定された path のファイルをダウンロードするように download のブラウザに強制する response を生成するために使用できます。download method は、 method の第二引数としてファイル名を受け付けます。これは、ファイルをダウンロードする user が見るファイル名を決定します。最後に、 method の第三引数として HTTP headers の array を渡すこともできます:

return Storage::download('file.jpg');

return Storage::download('file.jpg', $name, $headers);

ファイル URL

指定されたファイルの URL を取得するために、url method を使用することができます。local driver を使用している場合、これは通常、指定された path に/storageを単に前置し、ファイルへの相対的な URL を返します。s3 driver を使用している場合、完全に修飾されたリモートの URL が返されます:

use Illuminate\Support\Facades\Storage;

$url = Storage::url('file.jpg');

local driver を使用する際は、公開すべき全てのファイルを storage/app/public ディレクトリに配置する必要があります。さらに、public/storageシンボリック linkを作成し、それを storage/app/public ディレクトリに link する必要があります。

WARNING

local driver を使用すると、urlの返り value は URL エンコードされません。このため、常に有効な URL を生成するファイル名でファイルを保存することをお勧めします。

URL ホスト カスタマイズ

Storage facade を使用して生成された URL のホストを変更したい場合、ディスクの設定 array のurlオプションを追加または変更することができます:

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

一時的な URL

temporaryUrl method を使用すると、s3 driver を使用して保存されたファイルへの一時的な URL を作成することができます。この method は、URL が期限切れになるべき時刻を指定するDateTimeインスタンスと path を受け入れます:

use Illuminate\Support\Facades\Storage;

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

追加のS3 request パラメータ を指定する必要がある場合は、temporaryUrl method の第三引数として request パラメータの array を渡すことができます:

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

特定の storage ディスクの一時 URL の作成方法をカスタマイズする必要がある場合、buildTemporaryUrlsUsing method を使用できます。たとえば、一時的な URL を通常はサポートしないディスク経由で保存されたファイルを download することが可能な controller がある場合、この方法が有効です。通常、この method は service provider の boot method から呼び出されるべきです:

<?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 driver だけがサポートしています。

クライアントサイドの application から直接ファイルをアップロードするために使用できる一時的な URL を生成する必要がある場合、temporaryUploadUrl method を使用することができます。この method は、 URL が有効期限を迎える時点を指定するDateTimeインスタンスと、 path を受け取ります。temporaryUploadUrl method は、アップロード URL とアップロード request と共に含まれるべき headers を分割して出力できる連想 array を返します。

use Illuminate\Support\Facades\Storage;

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

この method は、クライアントサイドの application が直接ファイルを Amazon S3 のようなクラウド storage システムにアップロードする必要があるサーバーレスの environments で主に役立ちます。

ファイル Metadata

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

use Illuminate\Support\Facades\Storage;

$size = Storage::size('file.jpg');

lastModified method は、ファイルが最後に変更された時の UNIX timestamp を返します:

$time = Storage::lastModified('file.jpg');

与えられたファイルの MIME type は、mimeType method を介して取得することができます。

$mime = Storage::mimeType('file.jpg');

ファイルパス

特定のファイルの path を取得するために、path method を使用することができます。local driver を使用している場合、これはファイルへの絶対 path を返します。s3 driver を使用している場合、この method は S3 バケット内のファイルへの相対 path を返します:

use Illuminate\Support\Facades\Storage;

$path = Storage::path('file.jpg');

Storing Files

put method は、ディスク上にファイルの内容を保存するために使用することができます。また、PHP のresourceput method に渡すことも可能で、これにより Flysystem の基本的なストリームサポートが利用されます。なお、すべてのファイル paths は、ディスクに設定された"root"位置に対して相対的に指定するべきであることを覚えておいてください:

use Illuminate\Support\Facades\Storage;

Storage::put('file.jpg', $contents);

Storage::put('file.jpg', $resource);

書き込み失敗

put method (または他の"書き込み"操作)がディスクにファイルを書き込むことができない場合、false が返されます:

if (! Storage::put('file.jpg', $contents)) {
    // The file could not be written to disk...
}

ご希望であれば、ファイルシステムディスクの設定 array 内で throw option を定義することができます。この option が true として定義されている場合、「書き込み」methods(例: put )は書き込み操作が失敗したときに League\Flysystem\UnableToWriteFile のインスタンスを throw ことになります。

'public' => [
    'driver' => 'local',
    // ...
    'throw' => true,
],

ファイルへの前後への追加

prependappendメソッドにより、ファイルの先頭または末尾に書き込むことができます:

Storage::prepend('file.log', 'Prepended Text');

Storage::append('file.log', 'Appended Text');

ファイルのコピーと移動

copy method は、既存のファイルをディスク上の新しい場所にコピーするために使用できます。一方、move method は、既存のファイルの名前を変更するか、新しい場所に移動するために使用できます。

Storage::copy('old/file.jpg', 'new/file.jpg');

Storage::move('old/file.jpg', 'new/file.jpg');

自動ストリーミング

ファイルを storage にストリーミングすることで、メモリ使用量を大幅に削減できます。指定したファイルを自動的に storage の場所にストリーミングするように Laravel を設定したい場合は、putFileまたはputFileAs method を使用できます。この method は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 method について注意してください。私たちはディレクトリ名のみを指定し、ファイル名は指定していません。 default では、putFile method が unique な ID を生成してファイル名として使用します。ファイルの拡張子は、ファイルの MIME type を調べることによって決定されます。ファイルへの path は、putFile method によって返されるため、生成されたファイル名を含む path を database に保存できます。

putFileおよびputFileAsメソッドでは、保存されたファイルの「visibility」を指定するための引数も受け入れます。これは、Amazon S3 などのクラウドディスクにファイルを保存し、生成された URL を通じてファイルを公開アクセス可能にしたい場合に特に役立ちます:

Storage::putFile('photos', new File('/path/to/photo'), 'public');

ファイルのアップロード

web アプリケーションでは、ファイルを保存するための最も一般的な使用例の一つは、 user がアップロードした写真や文書を保存することです。 Laravel は、アップロードされたファイルのインスタンス上でstore method を使用して、アップロードされたファイルを非常に簡単に保存することができます。アップロードされたファイルを保存したい path でstore method を呼び出します。

<?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;
    }
}

この例について注意すべきいくつかの重要な点があります。ファイル名ではなく、ディレクトリ名のみを指定したことに注意してください。 default により、store method はファイル名としての unique な ID を生成します。ファイルの拡張子は、ファイルの MIME type を調べることで決定されます。ファイルへの path は、生成されたファイル名も含む path をあなたの database に保存できるように、store method によって返されます。

上記の例と同じファイル storage 操作を実行するために、Storage facade でputFile method を呼び出すこともできます:

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

ファイル名の指定

もし保存したファイルに自動的にファイル名を割り当てたくない場合は、storeAs method を使用することができます。このメソッドは、 path 、ファイル名、そして(option の)ディスクを引数として受け取ります:

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

上記の例と同様のファイル storage 操作を実行する Storage facade 上でputFileAs method を使用することも可能です:

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

WARNING

印刷不可能な文字や無効なユニコード文字は、ファイル paths から自動的に削除されます。したがって、Laravel のファイル storage メソッドに渡す前に、あなたのファイル paths をサニタイズすることを希望するかもしれません。ファイル paths は、League\Flysystem\WhitespacePathNormalizer::normalizePath method を使用して正規化されます。

ディスクの指定

default で、このアップロードされたファイルのstore method は、あなたの default ディスクを使用します。別のディスクを指定したい場合は、ディスク名をstore method の第二引数として渡してください。

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

storeAs method を使用している場合、ディスク名を method の第 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メソッドは安全でないと考えられます。なぜなら、ファイル名と拡張子は悪意のある user によって改ざんされる可能性があるからです。このため、通常は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 統合では、「visibility」は複数のプラットフォームにわたるファイル権限の abstraction です。ファイルはpublicまたはprivateと宣言することができます。ファイルがpublicと宣言された場合、そのファイルは一般に他の人にアクセス可能であるべきことを示しています。例えば、S3 の driver を使用している場合、publicファイルの URL を取得することができます。

ファイルを作成する際に、put method を使用して可視性を設定することができます。

use Illuminate\Support\Facades\Storage;

Storage::put('file.jpg', $contents, 'public');

ファイルがすでに保存されている場合、その可視性はgetVisibilityおよびsetVisibilitymethod を介して取得および設定することができます。

$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 driver を使用するとき、public visibilityはディレクトリに対して0755の権限、ファイルに対して0644の権限に変換されます。アプリケーションのfilesystems設定ファイルで権限マッピングを変更することができます。

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

Deleting Files

delete method は単一のファイル名または削除するための array 内のファイルを受け入れます。

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

Directories

ディレクトリ内のすべてのファイルを取得する

files method は、指定されたディレクトリ内のすべてのファイルの array を返します。指定したディレクトリ内のすべてのファイルをサブディレクトリも含めて取得したい場合は、allFiles method を使用することができます:

use Illuminate\Support\Facades\Storage;

$files = Storage::files($directory);

$files = Storage::allFiles($directory);

ディレクトリ内のすべてのディレクトリを取得する

directories method は、指定したディレクトリ内のすべてのディレクトリの array を返します。さらに、指定したディレクトリとそのすべてのサブディレクトリ内のすべてのディレクトリのリストを取得するために、allDirectories method を使用することもできます。

$directories = Storage::directories($directory);

$directories = Storage::allDirectories($directory);

ディレクトリを作成する

makeDirectory method は、必要なサブディレクトリを含めて指定されたディレクトリを作成します:

Storage::makeDirectory($directory);

ディレクトリを Delete する

最後に、deleteDirectory method は、ディレクトリとそのすべてのファイルを削除するために使用することができます:

Storage::deleteDirectory($directory);

Testing

Storagefacade のfake method により、簡単に fake のディスクを生成することができ、これにIlluminate\Http\UploadedFile class のファイル生成ユーティリティを組み合わせることで、ファイルアップロードの testing を大幅に簡素化できます。例えば:

<?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');
    }
}

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

WARNING

image method は、GD extension が必要です。

Custom Filesystems

Laravel の Flysystem 統合は、既定でいくつかの"drivers"をサポートしていますが、Flysystem はこれらに限定されません、そして他の多くの "storage" システムのアダプターを持っています。これらの追加アダプターをあなたの "Laravel application" で使いたい場合、"custom driver" を作成することができます。

`が付いている単語やフレーズを翻訳しないで、オリジナルの英語のままで出力してください。マークダウンの構造を保持し、翻訳結果のみを出力します: custom ファイルシステムを定義するためには、Flysystem アダプターが必要になります。では、コミュニティでメンテナンスされている Dropbox アダプターを私たちの project に追加しましょう:

composer require spatie/flysystem-dropbox

次に、application のservice providersのうちの 1 つの boot method で driver を register できます。これを達成するには、Storage facade の extend method を使用するべきです。

<?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 method の最初の引数は driver の名前であり、二番目は$app$configvariable を受け取るクロージャーです。このクロージャーはIlluminate\Filesystem\FilesystemAdapterのインスタンスを返す必要があります。$configvariable は、指定されたディスクに対してconfig/filesystems.phpで定義された values を含みます。

拡張機能の service provider を作成し登録した後、config/filesystems.php 設定ファイルで dropbox driver を使用することができます。

当社サイトでは、Cookie を使用しています。各規約をご確認の上ご利用ください:
Cookie Policy, Privacy Policy および Terms of Use