お問い合わせ

ブログ

これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。

Laravel storageの使い方

okuda Okuda 3 years

storage

ドライバとディスク

デフォルトドライバは local 、そのた s3ftp などが使える

ディスクは config\filesystems.php では以下の3つのが disks に設定されている。

  • local
  • public
  • s3

デフォルトはこの内の localdefault に設定されて、 .envFILESYSTEM_DRIVERlocal が初期値として設定されている

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');

公開フォルダ

rootstorage_path('app')が設定されているのでstorage/app以下のファイル操作が行える rootstorage_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.phplinks に以下のような設定があるのを確認
初期値で public/storagestorage/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 S3CachedAdapter をコンポサーでインストールする

composer require --with-all-dependencies league/flysystem-aws-s3-v3 "^1.0"
composer require league/flysystem-cached-adapter "~1.0"

Amazon S3用の設定

config\filesystems.phplinks に以下のような設定があるのを確認

'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');

そのた

putFileputFileAsは以下のように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');
Laravel storageの使い方 2021-11-19 09:36:58

コメントはありません。

4677

お気軽に
お問い合わせください。

お問い合わせ
gomibako@aska-ltd.jp