laravel は、Frank de Jonge によって開発された Flyststem PHP パッケージのおかげで、強力なファイル システムの抽象化を提供します。 Laravel のファイル システムは、ローカル ファイル システム、Amazon S3、Rackspace クラウド ストレージなど、一部のストレージ ドライバーのサポートを提供します。さらに驚くべきことは、laravel が統合された API インターフェイスを提供しているため、ストレージ構成オプションを通じてこれらのストレージ システムを切り替えることができることです。
ファイル システムの構成オプションは、config/filesystems.php ファイルに保存されます。このファイルでは、すべてのディスクを構成できます。各ディスク オプションには、使用するストレージ ドライバーとそのストレージの場所が含まれています。 laravel でデフォルトでサポートされているストレージドライバーについては、このファイルに対応する構成例があります。したがって、このファイルの構成オプションを変更するだけで、その強力な機能を使用できます。
もちろん、複数のディスクを構成したり、複数のディスクに同じドライバーを使用したりすることもできます。
パブリック ディスク
パブリック ディスクとは、一般の人がアクセスできることを意味します。デフォルトのパブリック ディスクはローカル ドライバーを使用し、そのファイルを storage/app/public ディレクトリに保存します。このディレクトリ内のファイルに Web からアクセスできるようにするには、public/storage から storage/app/public へのシンボリック リンクを作成する必要があります。この規則により、パブリックにアクセス可能なファイルが同じディレクトリ内に保持され、Envoyer のような手間のかからない継続的デプロイメント システムを使用する場合に、デプロイメント プロセス全体を簡単に共有できるようになります。
もちろん、ファイルが保存され、シンボリックリンクが確立されたら。アセット ヘルパー メソッドを使用して、ファイルの URL を生成できます。
echo asset('storage/file.txt')
ローカル ドライバー
ローカル ドライバーを使用する場合、知っておく必要があるのは、すべてのファイル操作が構成内の root オプションを基準にして定義されていることです。ファイルの目次。デフォルトでは、この値は storage/app ディレクトリに設定されます。したがって、次の方法ではファイルを storage/app/file.txt に保存します:
Storage::disk('local')->put('file.txt', 'Contents');
その他のドライバーの前提条件
S3 または Rackspace ドライバーを使用する前に、Composer を通じて適切なパッケージ ファイルをインストールする必要があります:
FTPドライバー設定
laravelのファイルシステムはFTP統合を非常によくサポートできますが、例は示されていませんデフォルトの設定ファイル。 FTP ファイル システムを構成する必要がある場合は、次の構成例を使用できます:
'ftp' => [ 'dirver' => 'ftp', 'host' => 'ftp.example.com', 'username' => 'your-username', 'password' => 'your-password', // Optional FTP Settings... // 'port' => 21, // 'root' => '', // 'passive' => true, // 'ssl' => true, // 'timeout' => 30,],
Rackspace ドライバー構成
laravel のファイル システムは Rackspace 統合を非常によくサポートできますが、デフォルトの構成ファイルには指定されていません。 。 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',],
ストレージ マスクは、構成するディスクと対話するために使用できます。たとえば、その put メソッドを使用して、ユーザーのアバター画像をデフォルトのディスクに保存できます。このメソッドを呼び出す前にディスク メソッドを使用しない場合、このメソッドはアバターをデフォルトのディスクに自動的に渡します:
<?phpnamespace App\Http\Controllers;use Storage;use Illuminate\Http\Request;use App\Http\Controllers\Controller;class UserController extends Controller{ /** * Update teh avatar for the given user. * * @param Request $request * @param int $id * @return Response */ public function updateAvatar(Request $request, $id) { $user = User::findOrFail($id); Storage::put( 'avatars/'.$user->id, file_get_contents($request->file('avatar')->getRealPath()) ); }}
複数のディスクを使用する場合、ストレージ マスク ディスク メソッドを使用して、アクセスするディスクを指定できます。もちろん、連鎖メソッドを使用して継続的な操作を実行することもできます。
$disk = Storage::disk('s3');$contents = Storage::disk('local')->get('file.jpg');
get メソッドを使用して、指定されたファイルの内容を取得できます。このメソッドは、ファイルの元の文字列コンテンツを返します:
$contents = Storage::get('file.jpg');
exists メソッドは、指定されたファイルがディスク上に存在するかどうかを判断するために使用できます:
$exists = Storage::disk('s3')->exists('file.jpg');
ローカルまたは s3 ドライバーを使用する場合は、url メソッドを使用できます指定されたファイルの URL を取得します。ローカル ドライバーを使用している場合は、指定されたパスの先頭に /storage プレフィックスを追加するだけで、相対ファイル パスが返されます。 s3 ドライバーを使用している場合は、完全なリモート RUL が返されます:
$url = Storage::url('file1.jpg');
注: ローカル ドライバーを使用する場合は、public/storage から storage/app/public へのシンボリック リンクを必ず作成してください。
ファイルのメタ情報
size メソッドは、指定されたファイルのバイト サイズを取得するために使用できます:
$size = Storage::size('file1.jpg');
lastModified メソッドは、UNIX タイムスタンプを使用する、指定されたファイルの最終変更時刻を返します:
$time = Storage::lastModified('file1.jpg');
Storage::put('file.jpg', $contents);Storage::put('file.jpg', $resource);
Storage::copy('old/file1.jpg', 'new/file1.jpg');
Storage:move('old,file1.jpg', 'new/file1.jpg');
ファイルの先頭または末尾にコンテンツを追加します
prepend 和 append 方法允许你轻松的往文件的起始或结束位置加入内容:
Storage::prepend('file.log', 'Prepended Text');Storage::append('file.log', 'Appended Text');
你可以通过使用 getVisibility 和 setVisibility 方法来进行文件可见性的检索和设置。可见性是跨平台的文件权限的抽象:
Storage::getVisibility('file.jpg');Storage::setVisibility('file.jpg', 'public');
另外,你可以在使用 put 方法的同时设置文件的可见性。有效的可见性值是 public 和 private:
Storage::put('file.jpg', $contents, 'public');
delete 方法可以接受一个文件名或者文件名所组成的数组,它将从磁盘中删除相应的文件:
Storage::delete('file.jpg');Storage::delete(['file1.jpg', 'file2.jpg']);
从目录中获取所有文件
files 方法会返回所给定目录中所有的文件所组成的数组。如果你想要在检索到的文件中包含所给定目录的子目录。那么你需要使用 allFiles 方法:
$file = Storage::files($directory);$files = Storage::allFiles($directory);
从给定的目录中获取所有的目录
directories 方法可以返回所给定目录下的所有子目录所组成的数组。另外你可以使用 allDirectories 方法递归检索子目录:
$directories = Storage::directories($directory);// Recursive...$directories = Storage::allDirectories($directory);
创建目录
makeDirectory 方法将创建给定的目录,包括其所需要的子目录:
Storage::makeDirectory($directory);
删除一个目录
最后,deleteDirectory 方法可以用来删除一个目录,并且其删除磁盘中该目录下所有的文件:
Storage::deleteDirectory($directory);
laravel 的文件系统对几种常见的存储系统提供了开箱即用的支持。事实上,文件系统并没有限制你只使用所提供的这些。你可以自己创建一个适配器来构建一个自定义的驱动去支持你所期望使用的文件存储系统。
你需要创建一个服务提供者来进行自定义文件存储系统的构建。比如 DropboxServiceProvider。在提供者的 boot 方法中,你需要使用 Storage 假面的 extend 方法来定义你自己的驱动:
<?phpnamespace App\Providers;use Storage;use League\Flysystem\Filesystem;use Dropbox\Client as DropboxClient;use Illuminate\Support\ServiceProvider;use League\Flysystem\Dropbox\DropboxAdapter;class DropboxServiceProvider extends ServiceProvider{ /** * Perform post-registration booting of services. * * @return void */ public function boot() { Storage::extend('dropbox', function ($app, $config) { $client = new DropboxClient( $config['accessToken'], $config['clientIdentifier'] ); return new Filesystem(new DropboxAdapter($client)); }); } /** * Register bindings in the container. * * @return void */ public function register() { // }}
extend 方法中的第一个参数应该是驱动的名称,第二个参数是一个闭包,闭包接受 $app 和 $config 变量。被解析的闭包必须返回一个 League\Flysystem\Filesystem 的实例。$config 变量包含了 config/filesystems.php 文件中指定磁盘的值。
一旦你创建了服务提供者并且注册了这个扩展,你就可以在 config/filesystem.php 配置文件中使用 dropbox 驱动了。