CakePHP4でCSV取り込み

今回は、CakePHP4SplFileObjectを使ってCSVをアップロードしてみたので、そのソースコードです。

template側

add.php

ファイル選択画面

<?= $this->Form->create($creditCardLog, ['type' => 'file']) ?>
<?= $this->Form->file('csv', ['accept'=>'.csv']); ?>
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>

ファイル選択画面(複数アップロード)

<?= $this->Form->create($creditCardLog, ['type' => 'file']) ?>
<?= $this->Form->file('csv[]', ['accept'=>'.csv', 'multiple' => true]); ?>
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>

複数の場合は、csvを配列にして、multipleを指定します。

controller側

***Controller.php

if ($csv = ($this->request->getData()['csv'] ?? false)) {

    // アップロード時の仮置き場所から読み出す。
    if ($csv && $uri =($csv->getStream()->getMetadata()['uri'] ?? false)) {

        // shift-jisをutf-8に変換
        $content = file_get_contents($uri);
        mb_convert_encoding($content, 'utf-8', 'sjis-win');
        file_put_contents($uri, $content);

        $fp = new SplFileObject($uri);
        $fp->setFlags(SplFileObject::READ_CSV);
        foreach ($fp as $line) {
            // print($line);
        }
    }
}

ここ↓には、仮ファイルのパスが取れる、普通にアップロードして、取り込むもよし

$csv->getStream()->getMetadata()['uri']

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です