Laravelでcsvファイルを一時的にアップロードする

LaravelでCSVファイルをサーバーに一時的に保存して、処理後に削除する方法のメモ

#前提
バージョン：Laravel6

#実装方法
##①csvファイルを一時保存する
```php: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"`が適用される。

```php: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ファイルを変数に格納する
```php: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`への格納後は好きな処理を記述する。

##③一時保存したファイルを削除する
```php:DataController.php
public function upload(Request $request) {
    //1、2部分は省略

    //$csvFileの処理内容

    // ファイルの削除
    \Storage::delete('data/' . $fileName);
}
```
`\Storage`ファサードはデフォルトでstorage/appを参照しているため`'data/'`を追記してパスを通す必要がある。

#サンプル全文
```php: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>
```
```php:web.php
Route::post('/upload', 'DataController@upload')->name('upload');
```
```php: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);

    }
}
```