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

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

● ディスクの種類

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

など。

● publicディスクへのシンボリックリンクを作成する

publicディスクを使用するときは次のコマンドを事前に実行しておきましょう。

php artisan storage:link

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

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

注意: Diskをまたいだコピーや移動は move()メソッドだけではできません
参考 : http://bit.ly/2Lk5Qw7

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

● Storageのメソッド

// ファイルの絶対パスを取得
$file_path = \Storage::disk('local')->path($path);

//  ファイル内容の取得
$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);

// ディレクトリ操作(ディスク指定)
Storage::disk('local')->makeDirectory($directory);

● Filesystemのメソッド

// ディレクトリ内のファイルやディレクトリを削除して 「ディレクトリの中身を空」にする
\File::cleanDirectory( storage_path().'/app/zip' );

// ディレクトリを パーミッション 0777 で作成する
umask( 0 );
\File::makeDirectory($path, '0777');

// ディレクトリ内のファイル一覧を取得(SplFileInfo クラスが返ります)
$files_list = \File::files( $folder );

https://www.php.net/manual/de/class.splfileinfo.php

● 戻り値などはソースを確認しましょう

https://github.com/illuminate/filesystem/blob/master/Filesystem.php

No.1426
06/25 15:08

edit