🙌
Laravelでファイルをコピーする方法
はじめに
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
を使ってフルパスを取得します
$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