LaravelでCSVファイルをサーバーに一時的に保存して、処理後に削除する方法のメモ
前提
バージョン:Laravel6
実装方法
①csvファイルを一時保存する
form.blade.php
<body>
{!! Form::open(['route' => 'upload', 'method' => 'post', 'files' => true]) !!}
{!! Form::label('file', 'ファイル') !!}
{!! Form::file('file', ['accept' => '.csv']) !!}
{!! Form::submit('送信') !!}
{!! Form::close() !!}
</body>
Laravel/collectiveではForm::open
に'files' => true
を追記することでformタグにenctype="multipart/form-data"
が適用される。
DataController.php
public function upload(Request $request) {
// バリデーション
$request->validate([
'file' => 'required|file|mimes:csv,txt|mimetypes:text/plain'
]);
// ファイル名生成
$time = date('YmdHis');
$uploadFile = $request->file('file');
$fileName = $time . $uploadFile->getClientOriginalName();
// 一時保存
$uploadFile->storeAs('data', $fileName);
}
一時的なファイルではあるが、念のためdate関数でタイムスタンプを作成してファイル名の重複を避けている。
storeAs('data', $fileName)
の保存先はstorage/app/dataとなる。
②csvファイルを変数に格納する
DataController.php
public function upload(Request $request) {
//1部分は省略
// ファイルの内容を取得
$csvFile = new \SplFileObject(storage_path('app/data/' . $fileName));
// splFileObjectをcsv読込用に設定
$csvFile->setFlags(
\SplFileObject::READ_CSV | // CSV列として行を読込
\SplFileObject::READ_AHEAD | // 先読み/巻き戻しで読み出し
\SplFileObject::SKIP_EMPTY | // 空行を読み飛ばし。ただしREAD_AHEADが有効になっていることが前提
\SplFileObject::DROP_NEW_LINE // 行末の改行を読み飛ばし
);
}
strage_path()
はデフォルトでstrageを参照しているため'app/data/'
を追記してパスを通す必要がある。
$csvFile
への格納後は好きな処理を記述する。
③一時保存したファイルを削除する
DataController.php
public function upload(Request $request) {
//1、2部分は省略
//$csvFileの処理内容
// ファイルの削除
\Storage::delete('data/' . $fileName);
}
\Storage
ファサードはデフォルトでstorage/appを参照しているため'data/'
を追記してパスを通す必要がある。
サンプル全文
form.blade.php
<body>
{!! Form::open(['route' => 'upload', 'method' => 'post', 'files' => true]) !!}
{!! Form::label('file', 'ファイル') !!}
{!! Form::file('file', ['accept' => '.csv']) !!}
{!! Form::submit('送信') !!}
{!! Form::close() !!}
</body>
web.php
Route::post('/upload', 'DataController@upload')->name('upload');
DataController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DataController extends Controller
{
public function upload(Request $request) {
// バリデーション
$request->validate([
'file' => 'required|file|mimes:csv,txt|mimetypes:text/plain'
]);
// ファイル名生成
$time = date('YmdHis');
$uploadFile = $request->file('file');
$fileName = $time . $uploadFile->getClientOriginalName();
// 一時保存
$uploadFile->storeAs('data', $fileName);
// ファイルの内容を取得
$csvFile = new \SplFileObject(storage_path('app/data/' . $fileName));
// splFileObjectをcsv読込用に設定
$csvFile->setFlags(
\SplFileObject::READ_CSV | // CSV列として行を読込
\SplFileObject::READ_AHEAD | // 先読み/巻き戻しで読み出し
\SplFileObject::SKIP_EMPTY | // 空行を読み飛ばし。ただしREAD_AHEADが有効になっていることが前提
\SplFileObject::DROP_NEW_LINE // 行末の改行を読み飛ばし
);
// ファイルの削除
\Storage::delete('data/' . $fileName);
}
}