LoginSignup
0
0

More than 1 year has passed since last update.

Laravel ファイルアップロードでname属性を配列で扱う処理例

Posted at

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

こんな所です。ユースケースにより、バリデーションを加えたりします。
簡単な紹介ですが、ご参考ください。

0
0
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
0
0