LaravelのStorageファサードを使用して、ファイルを保存する方法を書いています。
前回はRequestクラスを使用して、単純にアップロードする方法を書きました。
今回はStorageファサードを使用して、ファイルをローカルのstorage/app
配下に保存します。
また保存したファイルの取得・削除方法など、Storageファサードで使いそうなメソッドについてまとめています。
SFTPやAmazonS3など、外部のストレージを使うことも可能ですが、今回はローカルファイルシステムで使ってみました。
サンプルコードの検証にはLaravelの8を使っています。
ファイルを保存する
Storage
ファサードを使用して、アップロードする場合にはStorage
ファサードのput
メソッドを使用します。
Storage
ファサードを使用するときは、Illuminate\Support\Facades\Storage
をuse
文で読み込むようにしておきます。
Storageのテスト用にStorageController
というコントローラーを作成しました。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class StorageController extends Controller
{
public function put(Request $request) {
if (is_null($request->image_base64_text)) {
return response()->json('base64の画像テキストが指定されていません。');
}
$image = base64_decode($request->image_base64_text);
Storage::put('sushi.png', $image);
}
}
APIとして、base64形式で画像を受け取って保存します。
base64_decodeで取得したテキストを画像に変換しています。
画像の保存するときにStorage
ファサードを使用しています。
Storage::put('sushi.png', $image);
このようにすることで、第1引数に指定したパス名で、第2引数のデータが保存されます。
デフォルトでstorage/app
配下に保存されるので、storage/app/sushi.png
となります。
動作確認
Postmanでこのようにリクエストを飛ばしてみます。
そうすると、下記のようにstorage/app
配下に保存されました。
ファイルをディレクトリを指定して保存する
次はディレクトリを指定して、保存したい場合です。
下記のようにput
メソッドの第1引数にスラッシュ(/
)で区切ってディレクトリとファイル名を書きます。
Storage::put('images/sushi.png', $image);
これでstorage/app/images/sushi.png
にファイルが配置されます。
さらに階層を深くしたい場合には、スラッシュ区切りを増やしていくと良いです。
何らかのIDを挟んで、アップロードしたい場合は下記のように、変数で動的に設定してアップロードします。
Storage::put("images/{$id}/sushi.png", $image);
$id
が5だった場合は、storage/app/images/5/sushi.png
にファイルが配置されます。
ファイルを取得する
ファイルを取得したい場合は、Storage
のget
メソッドを使用します。
作成したStorageController
クラスにfetch
メソッドを追加しました。
public function fetch() {
$image = Storage::get('sushi.png');
$imageText = base64_encode($image);
return response()->json($imageText);
}
Storage
クラスのget
メソッドを使用して、storage/app
配下のファイルパスを指定すると、ファイルが返ってきます。
今回は返ってきたファイルをbase64形式でエンコードし直して、文字列として返すようにしました。
ディレクトリのファイルを取得する
保存した時と同じようにstorage/app
配下のパスをget
メソッドで指定すると返ってきます。
storage/app/images/sushi.png
の場合は、下記のように指定します。
Storage::get('images/sushi.png');
ファイルを削除する
ファイルを削除したい場合は、Storage
のdelete
メソッドを使用します。
storage/app/sushi.png
ファイルを削除する場合は、下記のようにstorage/app
配下のパスを指定します。
Storage::delete('sushi.png');
ディレクトリを削除する
ディレクトリをdeleteDirectory
メソッドを使用して指定すると、ディレクトリごと削除されます。
storage/app/images
配下にファイルやディレクトリが配置されていて、一括で削除する場合には下記のように指定します。
Storage::deleteDirectory('images');
ファイルのMimeTypeを取得する
ファイルのMimeタイプを取得したい場合にはmimeType
メソッドを使用します。
ファイルのパスを渡すと、Mimeタイプが返ってきます。
Storage::mimeType('sushi.png');
sushi.png
はpng
形式の画像ファイルです。
この場合に返ってくる文字列は「image/png」になります。
コメント