ファイルストレージ


概要

  • 構成
  • パブリック ディスク
    • ローカル ドライバー
    • ドライバーの前提条件
    • キャッシュ
    • ディスク インスタンスの取得
  • ファイルの取得
  • ファイルのダウンロード
      #ファイル URL
    • ## ファイル メタデータ
    • #ファイルの保存
    • #ファイルのアップロード
  • ##ファイルの可視性
  • カスタム ファイル システム
  • #はじめにLaravel は強力なファイル システムの抽象化を提供します。これは、Frank de Jonge の強力な
  • Flysystem のおかげです。
拡張パック。 Laravel ファイル システムの統合により、ローカル ファイル システム、Amazon S3、および Rackspace クラウド ストレージを操作するための使いやすいドライバーが提供されます。さらに良いことに、API は各システムで同じままであるため、これらのストレージ オプションの切り替えが簡単です。

構成

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

もちろん、必要に応じて複数のディスクを構成でき、複数のディスクで同じドライバーを共有することもできます。

パブリック ディスク

public ディスクは、パブリックにアクセスできるファイル用です。デフォルトでは、public ディスクは local ドライバーを使用し、これらのファイルを storage/app/public ディレクトリに保存します。ネットワーク経由でアクセスできるようにするには、public/storage から storage/app/public へのシンボリック リンクを作成する必要があります。このアプローチでは、パブリックにアクセス可能なファイルを同じディレクトリに保持するため、Envoyer などのゼロダウンタイム展開システムを使用する場合に、展開間でファイルを簡単に共有できます。 Artisan コマンド storage:link を使用してシンボリック リンクを作成できます:

Artisan コマンド storage:link を使用してシンボリック リンクを作成できます:

php artisan storage:link

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

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

#ローカル ドライバー

local ドライバーを使用する場合、すべてのファイル操作は、使用する root ディレクトリに関連します。設定ファイルで定義します。このディレクトリのデフォルト値は storage/app です。したがって、次のメソッドはファイルを storage/app/file.txt に保存します:

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

#ドライバー プログラム前提条件

Composer パッケージ

SFTP、S3、Rackspace などのドライバーを使用する前に、Composer を通じて対応するソフトウェア パッケージをインストールする必要があります:

    SFTP:
  • league/flysystem-sftp ~1.0
  • Amazon S3:
  • league/flysystem-aws-s3-v3 ~1.0
  • ラックスペース:
  • league/flysystem-rackspace ~1.0
キャッシュ アダプターの使用は、パフォーマンスを向上させるために絶対に必要です。追加のパッケージが必要です:

    CachedAdapter:
  • league/flysystem-cached-adapter ~1.0
S3 ドライバー構成

S3 ドライバー構成情報は、

config/filesystems.php 構成ファイルにあります。このファイルには、S3 ドライバーのサンプル構成配列が含まれています。このアレイは、独自の S3 構成と認証情報を使用して自由に変更できます。便宜上、これらの環境変数は AWS CLI で使用される命名規則と一致しています。

FTP ドライバー構成

Laravel のファイル システム統合は FTP を非常によくサポートできますが、FTP 構成の例はフレームワークのデフォルトの

filesystems .php# には含まれていません。 ## ファイル。必要に応じて、次のサンプル構成を使用できます:

'ftp' => [
    'driver'   => 'ftp',    
    'host'     => 'ftp.example.com',    
    'username' => 'your-username',    
    'password' => 'your-password',    
    // 可选的 FTP 配置项...    
    // 'port'     => 21,    
    // 'root'     => '',    
    // 'passive'  => true,    
    // 'ssl'      => true,   
     // 'timeout'  => 30,
   ],

SFTP ドライバー設定

Laravel の Flysystem 統合パッケージは SFTP と非常にうまく連携しますが、フレームワークのデフォルト設定ファイル filesystems.php にはサンプル設定が含まれていません。 SFTP ファイル システムを構成する場合は、次のサンプル構成を使用できます。

'sftp' => [
    'driver' => 'sftp',    
    'host' => 'example.com',    
    'username' => 'your-username',    
    'password' => 'your-password',    
    // 基于 SSH 密钥的身份验证设置...    
    // 'privateKey' => '/path/to/privateKey',    
    // 'password' => 'encryption-password',    
    // 可选的 SFTP 配置...    
    // 'port' => 22,    
    // 'root' => '',    
    // 'timeout' => 30,
   ],

Rackspace ドライブ構成

Laravel の Flysystem 統合パッケージは、Rackspace と非常によく連携します。ただし、フレームワークのデフォルト構成ファイル filesystems.php にはサンプル構成が含まれていません。 Rackspace ファイル システムを構成する場合は、次の構成例を使用できます:

'rackspace' => [
    'driver'    => 'rackspace',    
    'username'  => 'your-username',    
    'key'       => 'your-key',    
    'container' => 'your-container',    
    'endpoint'  => 'https://identity.api.rackspacecloud.com/v2.0/',    
    'region'    => 'IAD',    
    'url_type'  => 'publicURL',
  ],

Cache

指定したディスク機能のキャッシュを有効にするには、ディスクの構成項目に cache を直接追加する必要があります。 cache オプションは、キャッシュ ドライバー名 store によって駆動されるキャッシュ構成の配列である必要があります (翻訳者注: ドキュメント disk の元の説明テキストは、例のコード #store の ## と同じです。これは矛盾しています。コードを検証すると、実際には store であるはずなので、この変更が行われました。)、有効期限 (秒) 期限切れ、およびキャッシュ プレフィックス prefix 構成:

's3' => [
    'driver' => 's3',    
   // 驱动器其他配置...    
    'cache' => [    
        'store' => 'memcached',        
        'expire' => 600,        
        'prefix' => 'cache-prefix',   
      ],
   ],

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

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

use Illuminate\Support\Facades\Storage;
Storage::put('avatars/1', $fileContents);

If application複数のディスクと相互運用したい場合は、

Storage ファサードの disk メソッドを使用して、特定のディスク上のファイルを操作できます:

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

ファイルの取得

get メソッドを使用してファイルの内容を取得できます。このメソッドはファイルの元の文字列を返します。 。 コンテンツ。すべてのファイル パスの指定は、ディスクに構成された「ルート」ディレクトリを基準とする必要があることに注意してください。

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

exists このメソッドを使用すると、指定されたファイルがディスク上に存在するかどうかを確認できます。

$exists = Storage::disk('s3')->exists('file.jpg');

Download File

download

メソッドを使用して、ユーザーのブラウザで、パスを指定してファイルをダウンロードします。 download メソッドは、メソッドの 2 番目のパラメーターとしてファイル名を受け取ります。これにより、ユーザーがファイルをダウンロードするときに表示されるファイル名が決まります。最後に、メソッドの 3 番目の引数として HTTP 配列ヘッダーを渡すことができます:

return response()->download('file.jpg');
return response()->download('file.jpg', $name, $headers);

ファイル URL

url メソッドを使用して、特定のファイルの URL を取得できます。 local ドライバーを使用している場合は、通常、指定されたパスに /storage を追加し、そのファイルへの相対 URL を返します。 s3 または rackspace ドライバーを使用している場合は、完全なリモート URL が返されます:

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

{note} local ドライバーでは、パブリックにアクセスできるようにするすべてのファイルを storage/app/public ディレクトリに配置する必要があります。さらに、public/storage にシンボリック リンク を作成し、storage/app/public ディレクトリを指すようにする必要があります。

一時 URL

s3 または rackspace ドライバーを使用してファイルを保存する場合は、 # を使用できます。 ##temporaryUrl メソッドは、指定されたファイルの一時 URL を作成します。このメソッドは、パスと DateTime インスタンスを受け取り、URL の有効期限がいつ切れるかを指定します。

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

カスタム ローカル URL ホスト

必要な場合

local を使用するには、ドライバーはディスクに保存されているファイルのホストを事前定義します。ディスク構成配列に url オプションを追加できます:

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

ファイル メタデータ

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

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

このメソッドは、ファイルが最後に変更されたときの UNIX タイムスタンプを返します:

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

Save File

put

メソッドを使用して、元のファイルの内容をディスクに保存できます。また、PHP の

resourceput メソッドに渡すこともできます。これにより、ファイル システムでの基礎となるストリーム サポートが使用されます。大きなファイルを扱う場合は、この方法を使用することを強くお勧めします:

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

自動ストリーミング

Laravelで指定されたファイルを保存場所に自動的にストリーミングしたい場合は、 putFile または putFileAs メソッドを使用できます。このメソッドは、Illuminate\Http\File または Illuminate\Http\UploadedFile インスタンスを受け取り、ファイルを希望の場所に自動的にストリーミングします。

putFile

メソッドには、注意すべき点がいくつかあります。ファイル名ではなくディレクトリ名を指定します。デフォルトでは、putFile メソッドはファイル名として一意の ID を生成します。ファイル拡張子は、検出されたファイルの MIME タイプに基づいて決定されます。 putFile メソッドはファイル パスを返すため、ファイル パス (生成されたファイル名を含む) をデータベースに保存できます。

putFile

メソッドと putFileAs メソッドは、保存されたファイルの「可視性」を指定するメソッドも受け入れます。 S3 などのクラウド ディスクにファイルを保存し、そのファイルにパブリックにアクセスできるようにする場合は、次の関数を使用できます:

use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;
// 自动为文件名生成唯一的ID...
Storage::putFile('photos', new File('/path/to/photo'));
// 手动指定文件名...
Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');

ファイル データの書き込み

prepend

メソッドと append メソッドを使用すると、ファイルの先頭または末尾にデータを書き込むことができます。

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

ファイルのコピーと移動

copy

メソッドはファイルをディスク上の新しい場所にコピーするために使用され、move メソッドはファイルの名前を変更するか新しい場所に移動するために使用されます。 ##

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

ファイル アップロード
Web アプリケーションで最も一般的に使用されるファイル ストレージ シナリオは、アバター、写真、およびファイルをアップロードすることです。ファイル。 Laravel のファイルをアップロードするインスタンス メソッド

store

は、ファイルのアップロードとストレージの問題を簡単に処理できます。ファイル保存パスをパラメータとして指定して

store メソッドを呼び出すだけです。

Storage::copy('old/file.jpg', 'new/file.jpg');
Storage::move('old/file.jpg', 'new/file.jpg');
上記の例には、注意すべき点がいくつかあります。ファイル名ではなくディレクトリ名を指定します。デフォルトでは、store

メソッドはファイル名として一意の ID を自動的に生成します。ファイルの拡張子は、ファイルの MIME タイプをチェックすることによって決定されます。ファイルのパスとファイル名は、後続のデータベース ストレージのために

store メソッドによって返されます。 Storage

ファサードで

putFile メソッドを使用して、上記の例と同じ効果を実現することもできます:

<?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    class UserAvatarController extends Controller{ 
    /**
     * 更新用户头像.
     *
     * @param  Request  $request
     * @return Response
     */    
   public function update(Request $request)  
     {      
       $path = $request->file('avatar')->store('avatars');        
       return $path;   
     }
  }

ファイル名を指定する
保存されたファイルにファイル名を自動的に割り当てたくない場合は、パス、ファイル名、(オプション) を受け入れる

storeAs

メソッドを使用できます。パラメータとしてディスクを使用します:

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

ファサードで

putFileAs メソッドを使用すると、上記の例と同じファイル操作を実現できます:

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

ディスクの指定

デフォルトでは、store メソッドはデフォルトのディスクを使用します。別のディスクを指定する必要がある場合は、store メソッドの 2 番目のパラメータとしてディスク名を渡すことができます:

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

#ファイルの可視性

Laravel 統合ファイル システムでは、「可視性」は複数のプラットフォーム上のファイルのアクセス許可を抽象化したものです。ファイルは public または private として宣言できます。ファイルが public と宣言されている場合、他の人がそのファイルにアクセスできることを意味します。たとえば、S3 ドライバーを使用する場合、public と宣言されたファイルを取得できます。

ファイルの可視性は、put メソッドを使用して設定できます。

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

getVisibility メソッドと setVisibility メソッドは既存のメソッドを変更できます。ファイルのクエリと可視性の設定:

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

ファイルの削除

delete メソッドは A を受け取りますファイル名、またはディスク上のファイルを削除する配列形式のファイル名:

$visibility = Storage::getVisibility('file.jpg');
Storage::setVisibility('file.jpg', 'public')

必要に応じて、ディスク名を指定して、その下のファイルを削除できます:

use Illuminate\Support\Facades\Storage;
Storage::delete('file.jpg');
Storage::delete(['file.jpg', 'file2.jpg']);

Directory

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

filesこのメソッドは、指定されたディレクトリのすべてのファイルを返します。指定したディレクトリ (サブディレクトリを含む) 内のすべてのファイルのリストを取得する場合は、allFiles メソッドを使用できます。 directory

directories

このメソッドは、指定されたディレクトリの下にあるすべてのディレクトリの配列を返します。さらに、

allDirectories

メソッドを使用して、指定したディレクトリとそのサブディレクトリの下にあるすべてのディレクトリのリストを取得できます。

use Illuminate\Support\Facades\Storage;
Storage::disk('s3')->delete('folder_path/file_name.jpg');
Create Directory

makeDirectory

メソッドは、ディレクトリを再帰的に作成します。

use Illuminate\Support\Facades\Storage;
$files = Storage::files($directory);
$files = Storage::allFiles($directory);

ディレクトリの削除

deleteDirectory

このメソッドは、指定されたディレクトリを削除します。ディレクトリとその下のすべてのファイル:

$directories = Storage::directories($directory);
// 递归...
$directories = Storage::allDirectories($directory);

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

Laravel のファイル システムには、すぐに使用できるドライバーがいくつか用意されていますが、これらに限定されず、他のファイル システム用のアダプターも提供します。これらのアダプターを使用すると、Lavarel アプリケーション内でカスタム ドライバーを作成できます。

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

Storage::makeDirectory($directory);

次に、DropboxServiceProvider という名前のサービス プロバイダーを作成する必要があります。 boot メソッドで、Storage ファサードの extend メソッドを使用してドライバーをカスタマイズします:

Storage::deleteDirectory($directory);

extendメソッド 最初のパラメータはドライバーの名前で、2 番目のパラメータは $app 変数と $config 変数を受け入れるクロージャです。このクロージャは、League\Flysystem\Filesystem のインスタンスを返す必要があります。 $config 変数には、config/filesystems.php 内のディスクの場所が含まれています。

次に、config/app.php 構成ファイルにサービス プロバイダーを登録します。

composer require spatie/flysystem-dropbox

サービス プロバイダーを作成して登録した後、Add the # を渡すことができます。 ##dropbox ドライバーを config/filesystems.php 構成ファイルに追加して使用します。

この記事は、