こんにちは!エンジニアのオータケです!
今回はLaravelのファイル処理の使い方について学んでいきたいと思います。
PHPの関数でファイル操作をすることもできますが、Laravelにもファイル処理があります。
今回は
[基礎] Storageファサードの使い方
[実践] ディレクトリの操作方法
について解説していきます。
画像のアップロード機能後の画像の管理、PDFファイルを生成して保存する際の処理といったファイルを操作して何かしたい人には必見の記事です!
ファイル処理・ファイル操作とは
まず、ファイル処理・ファイル操作とは何かについてお話をしていきます。
皆さんはパソコン上でファイルを移動する時にWindowsやMacを使っていればマウスでドラッグしてどこかのフォルダに移動させると思います。
今回は、プログラムでファイルを操作できるようにします。
プログラムでファイル操作ができるようになれば、画像のアップロード機能後の画像の管理、PDFファイルをプログラムで生成して保存する際にディレクトリを作成してその中にファイルを保存するといったことが実現できるようになります。
PHP自体にはファイル処理が標準で扱えるようになっていますが、今回はLaravelで用意されているFileファサードでの解説をします。
LaravelにはStorageファサードもありますが、同じような使い方ができるため今回はFileファサードでの書き方に絞って紹介します。
初心者編
ファイルの拡張子を取得してみよう
拡張子を取得するメソッドです。
引数にはファイルまでのパスを指定します。
画像ファイルの拡張子を取得する例を見てみましょう。
$ext = File::extension('/dir/image.jpg');
実行結果
jpg
取得したファイルの拡張子を戻り値として返します。
実行結果を見るとわかりますが、jpgが返ってきていることがわかります。
このメソッドは内部的にはpathinfoを使って実装されています。
ファイルのサイズを取得してみよう
引数にはファイルパスを指定します。
ファイルパスに指定したファイル名のファイルサイズを取得します。
実際にファイルを取得する例を見てみましょう。
$size = File::size('/dir/image.jpg');
実行結果
2048
上記がファイルサイズを取得する例です。
戻り値にファイルサイズが返ってきます。
ここで注意したいのはファイルサイズの単位ですが、バイトで返ってくるため上記の例だと2048バイトという形で返ってきます。
このファイルは内部的にfilesizeを使って実装されています。
内部では実際には
ファイルの中身を取得してみよう
ファイルの中身を取得します。
引数にファイルパスを指定することで指定したファイルパスのファイルの内容を取得することができます。
$content = File::get('/dir/image.jpg');
変数$contentには取得したファイルの中身が入ります。テキストファイルの場合はその文字列が入るような仕組みになっています。HTMLファイルならHTMLタグを含む文字列が$contentに入る形になります。
このメソッドは内部的にfile_get_contentsを使って実装されています。
ファイルに書き込みをしてみよう
第一引数にファイルパスを指定します。
第二引数に保存するファイルコンテンツを指定します。
実際に保存するサンプルを見てみましょう。
$memo = 'hogehoge'; File::put('/dir/memo.txt', $memo);
この例では$memoに文字列が入っているのですが、この文字列をmemo.txtとして書き出すという例になっています。
このメソッドは内部的file_put_contentsを使って実装されています。
初級編
ここからは初級編に入ります。
入門編よりもより実践的な内容を扱っていきます。
初級編に入りましたが、実際にはそこまで難しいことをするわけではありません。
ファイルをコピーしよう
最初にまずファイルのコピーを行ってみましょう。
これも簡単ではあるので早速、例を見てみましょう。
File::copy('/dir/memo.txt', '/dir/memo2.txt');
第一引数にはコピー元のファイルを指定します。
そして第二引数にはコピー先のパス(ファイル名含む)を指定します。
このメソッドも他のメソッドどうように、内部的にはcopy関数で実装されています。
ファイルを削除しよう
次にファイルの削除について見てみましょう。
先程、コピーしたmemo2.txtを削除する想定で例を見てみましょう。
File::delete('/dir/memo2.txt');
これでファイルが存在している場合やパーミッション(ファイルの読み書きの権限)が適切であれば削除することができるでしょう。
この関数についてはunlink関数を使って実装されています。
ファイルを移動しよう
初級編最後にファイルを移動する方法について見ていきましょう。
LaravelのFileファサードは非常に直感的でわかりやすい命名が多いためファイルの移動もmoveという名前になります。
早速書き方について見てみましょう。
File::move('/dir/memo.txt', '/dir2/memo.txt');
第一引数には移動元のファイルパス(ファイル名含む)を指定します。
第二引数には移動先のファイルパスを指定します。
そうすることで移動元で指定したパスをから移動先のパスに移動することができます。
このメソッドは内部的にrenameで実装されています。
このメソッドもLaravelの命名の直感的でわかりやすい形が根付いていますね。
中級編
最後に中級編です。
ここでは少しだけ複雑な操作や実践で入門編や初級編でやった内容と組み合わせて使うような機能について解説していきます。
特定のパスがディレクトリまたはファイルのどちらか調べよう
引数で指定したパスがディレクトリなのかファイルなのか知りたい場合があります。
例えば、あるディレクトリ内のファイルだけ消したいという場合、パスの一覧を取得した際にその一覧にファイル名もディレクトリ名も混在している場合にはファイルなのかディレクトリなのかを判別する必要があります。
そういったことを実現するためのメソッドを次の例を見ながら学びましょう。
if(File::isDirectory('/dir')) { echo 'Directoryです!'; }
第一引数に調べたいパスを指定することでディレクトリかどうかを取得することができます。
もし、ディレクトリである場合はtrue、それ以外はfalseを返す仕組みになっています。
内部的にはis_dir関数を使って実装されています。
ディレクトリをコピーしよう
次にディレクトリをコピーしてみましょう。
先程はファイルのコピーをしましたが次はディレクトリをコピーします。
File::copyDirectory('/dir', '/dir2');
このcopyDirectoryメソッドを使うことでディレクトリを丸ごとコピーできます。
メソッドの便利なところはディレクトリの内部にあるファイルなど再帰的(全部・まるごと)にコピーしてくれます。
第一引数で指定したディレクトリを第二引数で指定した名前のパスにコピーします。
ディレクトリを削除しよう
最後にディレクトリを削除する方法について解説します。
先程のディレクトリコピーの項で行ったディレクトリdir2を削除する例を見てみましょう。
File::deleteDirectory('/dir2');
こちらのディレクトリ削除メソッドもコピーメソッドと同じく、再帰的に指定したディレクトリごとすべて削除してくれます。
このコピーと削除のメソッドは地味に便利ではないかと思います。
まとめ
いかがでしょうか?
LaravelのFileファサードはPHPのファイル処理系関数をラップしている形になりますが、名前も覚えやすく使い方もシンプルであるためすぐ慣れて親しむことができるのではないかと思います。
今回紹介した機能は一部であるため、興味があればぜひ見てくださいね。
プロジェクトのルートディレクトリからvendor/laravel/framework/src/illuminate/Filesystem/Filesystem.phpを見ると良いですよ!