今回は、CakePHP4でSplFileObjectを使って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']