Laravel ファイルアップロードでname属性を配列で扱う処理例を紹介します
ファイルアップロードでname属性を配列で扱うのは、不確定の数をファイルアップロードを受け取りたい場合に使うケースがあります。
それでは順番に確認していきます。
HTML
HTML側のFILE INPUTを以下の通りにname属性を配列にした場合。
view/upload.blade.php
<div class="row">
<div class="col-sm-3 col-form-label-sm mb-1">添付ファイル</div>
<div class="col-sm-9 mb-1">
<input id="file-multiple-input" type="file" name="file[]" multiple="">
</div>
</div>
アップロード先の定義
ファイルCONFIGで定義を作っておくと、メンテナンスや再利用の管理がしやすいので、
使うストレージ設定の配列にroot、filepathを付け足しておく。
今回は、documentsに入れています。
config/filesystems.php
<?php
return [
/*間省略*/
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
],
'documents' => [
'driver' => 'local',
'root' => storage_path('app/documents'),
'url' => env('APP_URL').'/documents',
'filepath' => '/documents',
]
],
];
アップロード処理
POSTで受け取ったら、foreachループで1つ1つファイルを保存して、dbに記録する処理を行っています。
Controller/FileUploadController.php
if ($request->has('file')) {//ファイル送信の有無
foreach ($request->file as $key){{//配列をループする
//ファイルの保存先などのパスをCONFIGで定義を取っくる
$storagePath = Config::get('filesystems.disks.documents.root');
$folderpath = Config::get('filesystems.disks.documents.filepath');
$OriginalName = $key->getClientOriginalName();//POSTされてくるファイル名
$extension = $key->getClientOriginalExtension();//POSTされてくるファイルの拡張子
$pathInfo = pathinfo($OriginalName);
//ファイル名をユニークにしたいので、
//ファイル名が日本語だったり、保存先に同じファイル名があったりするなら、
//新しいファイル名を命名する。
if (preg_match("/^[\x21-\x7e]{1,50}+$/", $pathInfo['filename'])) {
$UploadFileName =$this->unique_filename($storagePath.DIRECTORY_SEPARATOR.$pathInfo['filename'].'.'.$extension);
} else {
$newfileName = md5(date('YmdHis').$pathInfo['filename']).'.'.$extension;
$UploadFileName =$this->unique_filename($storagePath.DIRECTORY_SEPARATOR.$newfileName);
}
//指定のパスに指定のファイル名でファイルを保存
$filepath = $key->storeAs(DIRECTORY_SEPARATOR, $UploadFileName, ['disk'=>'documents']);
//DBに相対パスで保管
$doc = new Documents;
$doc->filepath = $folderpath.DIRECTORY_SEPARATOR.$filepath;
$doc->save();
}
}
/**
* ユニークファイル名の生成
*
* @param string $org_path
* @param int $num
* @return string
*/
protected function unique_filename($org_path, $num=0){
if( $num > 0){
$info = pathinfo($org_path);
$path = $info['dirname'].'/'.$info['filename']."_".$num.'.'.$info['extension'];
} else {
$info = pathinfo($org_path);
$path = $info['dirname'].'/'.$info['filename'] .'.'. $info['extension'];
}
if(file_exists($path)){
$num++;
return $this->unique_filename($org_path, $num);
} else {
$info = pathinfo($path);
$fileName = $info['filename'] .'.'. $info['extension'];
return $fileName;
}
}
こんな所です。ユースケースにより、バリデーションを加えたりします。
簡単な紹介ですが、ご参考ください。