人気のPHP WEBアプリケーションフレームワークLaravelのTipsを記録していきます

Laravel の ディスク・ファイルシステム Storage を使用する

● ディスクの種類

local : ローカルディスク(一般公開しないファイル)
public : ローカルディスク(一般公開するファイル。コマンド aritizan storage:link を実行すると公開することができる。 )
s3 : Amazon S3
ftp :FTP (別途パッケージのインストールが必要)

など。

● ディスクの設定記述場所

config/filesystems.php

    'disks' => [
        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],
        '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'),
        ],
    ],

● ディスク設定にパーミッションを設定する

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
            // ===== permissions =====
            'permissions' => [
                'dir' => [
                    'public'  => 0775 ,
                ],
                'file' => [
                    'public' => 0664 ,
                ],
            ],
            // ===== / permissions =====
        ],

● ディスク(Local )への移動の例

次のようなファイル移動を行うとします。

<アプリのトップディレクトリ>/storage/app/tmp/test.csv
 ↓
<アプリのトップディレクトリ>/storage/app/csv/123456789.csv

Laravel Storage を使って次の様に記述します。

$disk = \Storage::disk('local');
$disk->move("tmp/test.csv", "csv/12345679.csv" );

簡単ですね。 おすすめです。

● Laravel Storage を使ってファイルのパスを表示させる

dump( $disk->path(false) );    // パスのみの表示
dump( $disk->path("csv/test.csv") );    // ファイル名をフルパスで表示

 ↓ 表示例

/var/www/laravel/my_app/storage/app/
/var/www/laravel/my_app/storage/app/test.csv

● public のディスクの保存したファイルにアクセスする

url(\Storage::disk('public')->url($image_name))

blade

<img src="{{ url(\Storage::disk('public')->url($image_name)) }}">

.env を次のように修正しておきましょう

APP_URL=http://localhost

 ↓

APP_URL=https://YOUR-SITE.TLD/

● Laravel Disk を使ってローカルの pdf や画像を表示する

例えばコントローラに次のように記述するとローカルファイルのデータを表示できます。

        $pdf_file_path = 'pdf/125_01.pdf';
        $disk = \Storage::disk('local');
        $mimetype = $disk->mimeType($pdf_file_path);
        return response($disk->get($pdf_file_path))->header('Content-Type', $mimetype);

● Laravel Diskのメソッド

$contents = Storage::get('file.jpg');
$exists = Storage::disk('s3')->exists('file.jpg');

return Storage::download('file.jpg');
return Storage::download('file.jpg', $name, $headers);

// ファイル情報
$url = Storage::url('file.jpg');
$size = Storage::size('file.jpg');
$time = Storage::lastModified('file.jpg');

// ファイル操作
Storage::put('file.jpg', $contents);
Storage::copy('old/file.jpg', 'new/file.jpg');
Storage::move('old/file.jpg', 'new/file.jpg');

// ディスク外のディレクトリにあるファイルをコピー
$tmp_file_fullpath_name = "/tmp/test.jpg";
$d = file_get_contents( $tmp_file_fullpath_name );
\Storage::disk($file_store_disk)->put("{$file_store_dir}/{$image_name}", $d);


// 公開状態かどうか
Storage::setVisibility('file.jpg', 'public')

// ファイルの削除
Storage::delete('file.jpg');
Storage::delete(['file.jpg', 'file2.jpg']);
Storage::disk('s3')->delete('folder_path/file_name.jpg');

// ファイル/ディレクトリ一覧の取得
$files = Storage::files($directory);
$files = Storage::allFiles($directory);
$directories = Storage::directories($directory);
$directories = Storage::allDirectories($directory);

// ディレクトリ操作
Storage::makeDirectory($directory);
Storage::deleteDirectory($directory);
No.1426
05/13 17:03

edit