LoginSignup
2
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-29

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

    }
}
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3