ブログ
これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。
Laravel storageの使い方
storage
ドライバとディスク
デフォルトドライバは local
、そのた s3
、 ftp
などが使える
ディスクは config\filesystems.php
では以下の3つのが disks
に設定されている。
- local
- public
- s3
デフォルトはこの内の local
が default
に設定されて、
.env
の FILESYSTEM_DRIVER
に local
が初期値として設定されている
config\filesystems.php
//...
'default' => env('FILESYSTEM_DRIVER', 'local'),
//...
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
// urlがない
],
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
],
],
//...
.env
#...
FILESYSTEM_DRIVER=local
#...
ローカル操作方法
以下のような操作が行える
-
build();
-
get('path+filename');
-
path('path+filename');
-
put('path+filename', 'content', ['visibility']);
-
putFile('path', 'filename', ['visibility']);
-
putFileAs('path', $file_object, 'filename', ['visibility']);
-
exists('path+filename');
-
missing('path+filename');
-
copy('path+filename', 'path+filename');
-
move('path+filename', 'path+filename');
-
delete('path+filename');
-
prepend('path+filename', 'text')
-
append('path+filename', 'text')
-
makeDirectory('path');
-
deleteDirectory('path');
-
directories('path')
-
allDirectories('path');
-
files('path');
-
allFiles('path');
-
size('path+filename');
-
mimeType('path+filename');
-
lastModified('path+filename');
-
download('path+filename', ['filename'], ['headers_array']);
-
response('path+filename', ['filename'], ['headers_array'], ['disposition']);
/**
* disk ドライバの指定
* get ファイルのコンテンツを取得
*/
// ディスクを指定する場合はこのようにする
$local = Storage::disk('local');
$public = Storage::disk('public');
$s3 = Storage::disk('s3');
// ディスクを臨時で取得
$storage = Storage::build([
'driver' => 'local',
'root' => storage_path(), // /var/www/storage
]);
// ファイルのコンテンツを取得
$content = $local->get('sample.txt');
// デフォルトにlocalドライバが.envで設定されているので「disk」を省略できる
$content = Storage::get('sample.txt');
/**
* path+filenameで指定
* localドライバーの場合はファイルへの絶対パス
* S3ドライバーS3バケット内のファイルへの相対パス
*/
$res = $local->path('sample.txt');
// /var/www/storage/app/storage_app.txt
/**
* path+filenameでファイルを第2引数で指定した内容で保存
* 成功して場合はtrueを返す
*/
$res = $local->put('sample.txt', 'put!'); // true
// pathで指定した場合はその場所保存、にフォルダも作成される
$res = $local->put('first/sample.txt', 'content!'); // true
// 可視性をた場合
$res = $local->path('first/sample.txt', 'content!', 'public');
// true
/**
* putFile 指定したPATHにファイルを一意のIDで保存
* 成功した場合はファイル名を返す
*/
// ストレージに置いたsample/sample.txtをファイルオブジェクトとして取得
$file_path = storage_path('sample/sample.txt');
$tmpFile = new File($file_path);
$res = $local->putFile('', $tmpFile);
// LUdtfjKzqHLH6ZoFzJFApCqO2HpIK4CVzRGHD9ca.txt
$res = $local->putFile('first', $tmpFile);
// vmNbI0Bg3TlHE7142Qj5XnHFQyH3954KC3EobnUU.txt
// 可視性をた場合
$res = $local->putFile('first', $tmpFile, 'public');
/**
* putFileAs 指定したPATHに名前おw指定して保存
* 成功した場合はpath+filenameを返す
*/
$res = $local->putFileAs('first', $tmpFile, 'sample.txt');
// first/form_sample.txt
// 可視性をた場合
$res = $local->putFileAs('first', $tmpFile, 'sample.txt', 'public');
// first/form_sample.txt
/**
* exists ファイルが存在するかチェック
* missing ファイルが存在しないかかチェック
*/
// 存在する場合true
$res = $local->exists('first/sample.txt'); // true
// existsの逆で存在すればfalse
$res = $local->exists('first/sample.txt'); // false
/**
* copy ファイルのコピーをpath+filename -> path+filenameで行う
* 成功して場合はtrueを返す
*/
$res = $local->copy('first/sample.txt', 'first/copy.txt'); // true
/**
* move ファイルの移動をfrom:path+filename -> to:path+filenameで行う
* 成功して場合はtrueを返す
*/
$res = $local->move('first/from.txt', 'to.txt'); // true
/**
* delete ファイルの削除をpath+filenameで行う
* 成功して場合はtrueを返す
*/
$res = $local->delete('first/form_sample2.txt'); // true
/**
* prepend path+filenameで指定、ファイルの最初に書き込む
* 成功して場合はtrueを返す
*/
$res = $local->prepend('first/sample.txt', 'text') // true
/**
* append ath+filenameで指定、ファイルの最後に書き込む
* 成功して場合はtrueを返す
*/
$res = $local->append('first/sample.txt', 'text') // true
/**
* makeDirectory ディレクトリをpathで作成
* 成功して場合はtrueを返す
*/
$res = $local->makeDirectory('first/second'); // true
/**
* deleteDirectory ディレクトリをpathで中身ごと削除
* 成功して場合はtrueを返す
*/
$res = $local->deleteDirectory('next'); // true
/**
* directories pathで指定してディレクトリの1階層のディレクトリ一覧を取得
*/
$res = $local->directories('/');
// [
// 0 => "public"
// 1 => "first"
// ]
/**
* allDirectories pathで指定したディレクトリ以下にある全てのディレクトリのpathの一覧を取得
* pathの配列を返す
*/
$res = $local->directories('/');
// [
// 0 => "public"
// 1 => "first"
// 2 => "first/second"
// ]
/**
* size ファイルをpath+filenameで指定してファイルサイズを取得
* ファイルサイズをバイト数で返す
*/
$res = $local->size('sample.txt'); // 9
/**
* size ファイルをpath+filenameで指定してマイムタイムを取得
* ファイルサイズをバイト数で返す
*/
$res = $local->mimeType('sample.txt'); // text/plain
/**
* url ファイルのurlを取得
*/
$url = $public->url('asdf.txt');
// http://localhost:3000/storage/asdf.txt
// 期限付きで取得
$url = $s3->temporaryUrl('asdf.txt', now()->addMinutes(5));
/**
* size ファイルをpath+filenameで指定してファイルが最後に変更されたときのUNIXタイムスタンプを取得
*/
$timestamp = $local->lastModified('storage_app.txt');
// 1629180535
$res = Carbon::createFromTimestamp($timestamp)->toDateTimeString();
// 2021-08-17 06:08:55
/**
* files pathで指定してディレクトリ内の1階層のファイル一覧を取得
* 指定したディレクトリ内にあるフォルダは無視される
* ファイルの配列を返す
*/
$res = $local->files(''); // array
/**
* allFiles pathで指定したディレクトリ以下にある全てのファイルのpath+filenameの一覧を取得
* ファイルの配列を返す
*/
$res = $local->allFiles(''); // array
/**
* download
* ユーザーのブラウザに指定したpathでファイルをダウンロードするように強制するレスポンスを生成
* 2番目の引数としてファイル名
* 3番目の引数としてHTTPヘッダの配列
*/
return $local->download('storage_app.txt');
// mime type
$mimeType = Storage::mimeType($filepath);
// headers
$headers = [['Content-Type' => $mimeType]];
return $local->download('form_to.txt', 'dl_file.txt', $headers);
/**
* response
* ユーザーのブラウザに指定したpathでファイルをダウンロードするように強制するレスポンスを生成
* 2番目の引数としてファイル名
* 3番目の引数としてHTTPヘッダの配列
* 4番目の引数としてdispositon
*/
// mime type
$mimeType = Storage::mimeType($filepath);
// headers
$headers = [['Content-Type' => $mimeType]];
// そのままブラウザに表示
return $local->response('form_to.txt', 'dl_file.txt', $headers);
// ダウンロードさせる
return $local->response('form_to.txt', 'dl_file.txt', $headers, 'attachment');
/**
* setVisibility 可視化をセット
* getVisibility 可視化を取得
*/
$res = $local->setVisibility('photos/filename.jpg', 'public');
$res = $local->setVisibility('photos/filename.jpg', 'private');
$res = $local->getVisibility('photos/filename.jpg');
公開フォルダ
root
はstorage_path('app')
が設定されているのでstorage/app
以下のファイル操作が行える
root
は storage_path('app/public')
が設定されているので storage/app/public
以下のファイル操作が行える
config\filesystems.php
//...
'disks' => [
//...
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
// urlを取得した場合のプレフィックス
'url' => env('APP_URL').'/storage',
// public、privateを設定でき:一般的に他のユーザーがアクセスできる必要を示す
'visibility' => 'public',
],
],
//...
公開フォルダのシンボリックリンクを作成
config\filesystems.php
の links
に以下のような設定があるのを確認
初期値で public/storage
に storage/app/public
のシンボリックリンクを作成するようになっている
'links' => [
public_path('storage') => storage_path('app/public'),
],
artisanコマンドを実行して反映させる
php artisan storage:link
これにより public
ディレクトリからのrulで取得できる
公開フォルダを追加する
storage
の他に images
を追加する場合
config\filesystems.php
//...
'disks' => [
//...
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
// 追加
'images' => [
'driver' => 'local',
'root' => storage_path('app/images'),
'url' => env('APP_URL') . '/images',
'visibility' => 'public',
],
],
//...
'links' => [
public_path('storage') => storage_path('app/public'),
// 追加
public_path('images') => storage_path('app/images'),
],
artisanコマンドを実行して反映させる
php artisan storage:link
※ 追加した場合は .gitignore
にシンボリックリンク先を追加しておく
.gitignore
#...
public/storage
public/images
#...
Amazon S3
Amazon S3
と CachedAdapter
をコンポサーでインストールする
composer require --with-all-dependencies league/flysystem-aws-s3-v3 "^1.0"
composer require league/flysystem-cached-adapter "~1.0"
Amazon S3用の設定
config\filesystems.php
の links
に以下のような設定があるのを確認
'disks' => [
// ...
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
],
],
AWS_ACCESS_KEY_ID
,
AWS_SECRET_ACCESS_KEY
,
AWS_DEFAULT_REGION
,
AWS_BUCKET
,
AWS_URL
, を .env
で設定
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=example
AWS_URL=https://s3-ap-northeast-1.amazonaws.com/example/
AWS_USE_PATH_STYLE_ENDPOINT=false
S3操作方法
diskを指定するだけで、その他はlocalと同じ
ファイルの'url'を取得することができる
// s3リクエストパラメーター付き
$url = $s3->temporaryUrl(
'asdf.txt',
now()->addMinutes(5),
[
'ResponseContentType' => 'application/octet-stream',
'ResponseContentDisposition' => 'attachment; filename=file2.jpg',
]
);
アップロードについて
リクエストからポストされたフアイルを取得してアップロードする場合
Requestを使った場合
$post = $request->file('photo');
/**
* store
*/
$res = $post->store('photos');
$res = $post->store('photos', 's3');
// 可視性を付ける場合
$res = $post->storePublicly('photos');
$res = $post->storePublicly('photos', 's3');
/**
* storeAs
*/
$res = $post->storeAs('photos', 'filename.jpg');
$res = $post->storeAs('photos', 'filename.jpg', 's3');
// 可視性を付ける場合
$res = $post->storePubliclyAs('photos', 'filename.jpg');
$res = $post->storePubliclyAs('photos', 'filename.jpg', 's3');
storageを使った場合
$post = $request->file('photo');
$local = Storage::disk('local');
$s3 = Storage::disk('s3');
/**
* storeAs
*/
$res = $local->putFile('photos', $post);
$res = $s3->putFile('photos', $post);
// 可視性を付ける場合
$res = $local->putFile('photos', $post, 'public');
$res = $s3->putFile('photos', $post, 'public');
/**
* storeAs
*/
$res = $local->putFileAs('photos', $post, 'filename.jpg');
$res = $s3->putFileAs('photos', $post, 'filename.jpg');
// 可視性を付ける場合
$res = $local->putFileAs('photos', $post, 'filename.jpg', 'public');
$res = $s3->putFileAs('photos', $post, 'filename.jpg', 'public');
そのた
putFile
とputFileAs
は以下のようにpaht
でもUploadedFileインスタンス
でも、Fileインスタンス
でもいけるようす
// Request (UploadedFileインスタンス)
$post = $request->file('photo');
dump($post);
// UploadedFileのfakeで作成したUploadedFileインスタンス
$fake = UploadedFile::fake()->image('sample.jpg');
dump($fake);
// path
$path = storage_path('sample/sample.txt');
dump($path);
// Fileインスタンス
$file = new File($path);
dump($object);
$local = Storage::disk('local');
$res = $local->putFile('photos', $post);
$res = $local->putFile('photos', $fake);
$res = $local->putFile('photos', $path);
$res = $local->putFile('photos', $file);
$res = $local->putFileAs('photos', $post, 'filename.jpg');
$res = $local->putFileAs('photos', $fake, 'filename.jpg');
$res = $local->putFileAs('photos', $path, 'filename.jpg');
$res = $local->putFileAs('photos', $file, 'filename.jpg');
コメントはありません。