🙌

Laravelでファイルをコピーする方法

2021/07/05に公開

はじめに

Laravelでファイルのコピーが必要になったので、試してみました。

やってみたこと

Laravelプロジェクトを作成

$ composer create-project laravel/laravel --prefer-dist bulk-copy-files

コピーに使うサンプルディレクトリ・ファイルを作成

  • コピー元とコピー先を想定したディレクトリを作成
$ cd bulk-copy-files/
$ mkdir -p storage/app/public/dir1
$ mkdir -p storage/app/public/dir2
  • 3行だけのサンプルファイル(.csv)を作成
$ cd storage/app/public/dir1
$ head *
==> sample1.csv <==
1,apple,100
2,banana,150
3,cherry,200
==> sample2.csv <==
3,apple,100
2,banana,150
1,cherry,200
==> sample3.csv <==
3,apple,100
1,banana,150
2,cherry,200

コピー処理の実装

web.phpを編集します。

<?php

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\File;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Route::get('/doCopy', function () {
    $loadFrom = storage_path( 'app/public/dir1/'); // e.g. /var/www/html/storage/app/public/dir1
    $loadTo   = storage_path( 'app/public/dir2/'); // e.g. /var/www/html/storage/app/public/dir2

    $files  = File::files( $loadFrom );
    foreach( $files as $file ){
        $fileName = $file->getFilename(); // e,g, sample1.csv
        File::copy( $loadFrom.$fileName, $loadTo.$fileName);
    }
});

(補足説明)ポイント

use Illuminate\Support\Facades\File;

Fileクラスをuseします

Route::get('/doCopy', function () {
   $loadFrom = storage_path( 'app/public/dir1/'); // e.g. >/var/www/html/storage/app/public/dir1
   $loadTo   = storage_path( 'app/public/dir2/'); // e.g. >/var/www/html/storage/app/public/dir2

storage_path を使ってフルパスを取得します

https://readouble.com/laravel/8.x/ja/helpers.html

  $files  = File::files( $loadFrom );
   foreach( $files as $file ){
       $fileName = $file->getFilename(); // e,g, sample1.csv
       File::copy( $loadFrom.$fileName, $loadTo.$fileName);
   }
});

File::copy でコピーを行います。

動作確認

  • ローカルサーバを起動
$ php artisan serve
  • 実行前の状態を確認しておきます
$ tree storage/app/public/
storage/app/public/
├── dir1
│   ├── sample1.csv
│   ├── sample2.csv
│   └── sample3.csv
└── dir2
2 directories, 3 files
  • curlでHTTPアクセスして、dir2にファイルが入ることを確認
$ curl http://localhost:8000/doCopy
$ tree storage/app/public/
storage/app/public/
├── dir1
│   ├── sample1.csv
│   ├── sample2.csv
│   └── sample3.csv
└── dir2
    ├── sample1.csv
    ├── sample2.csv
    └── sample3.csv
2 directories, 6 files

Discussion