코드이그나이터4 뷰 다루기 - 13 - 첨부파일 여러개 업로드

koeunyeon·2021년 3월 25일
0

첨부파일 여러개

코드이그나이터4에서 여러개의 첨부파일을 다루는 방법을 확인해 보겠습니다. 주요 로직은 첨부파일과 동일하므로 여러개를 읽을 때 처리 절차만 중점적으로 보면 됩니다.
우리가 만들 페이지는 아래와 같습니다.

코드는 https://github.com/koeunyeon/ci4/tree/view-attach-multi에 있습니다.


View 컨트롤러에 아래의 메소드를 추가합니다.
app/Controllers/View.php

public function upload_multi(): string
{
    $files = $this->request->getFileMultiple("files"); // (1)
    
    if ($files == null) {  // (2)
        return View("/view/upload_multi", [
            'file_info_array' => []
        ]);
    }

    $file_info_array = [];  // (3)

    foreach ($files as $file) {  // (4)
        $fileInfo = [];
        if ($file != null) {
            if (!$file->isValid()) {
                $errorString = $file->getErrorString();
                $errorCode = $file->getError();
                $fileInfo['hasError'] = true;
                $fileInfo['errorString'] = $errorString;
                $fileInfo['errorCode'] = $errorCode;

            } else {
                $fileInfo['hasError'] = false;
                if ($file->hasMoved() === false) {                    
                    $fileInfo['mimeType'] = $file->getMimeType();

                    $savedPath = $file->store();

                    $fileInfo['savedPath'] = $savedPath;
                    $fileInfo['clientName'] = $file->getClientName();
                    $fileInfo['name'] = $file->getName();
                    $fileInfo['clientMimeType'] = $file->getClientMimeType();
                    $fileInfo['clientExtention'] = $file->getClientExtension();
                    $fileInfo['guessExtention'] = $file->guessExtension();
                }
            }
        }

        array_push($file_info_array, $fileInfo);  // (5)
    }

    return View("/view/upload_multi", [
        'file_info_array' => $file_info_array
    ]);
}

코드를 확인해 보겠습니다.
(1) 코드이그나이터4에서 "이름(키)이 같은 여러 개의 첨부파일"을 읽으려면 $this->request->getFileMultiple(키) 형태로 사용합니다. 반환값은 $file 순차 배열입니다.

(2) 첨부 파일 영역이 비어있다면 빈 뷰를 리턴합니다.

(3) 뷰에 리턴할 첨부파일 목록을 담을 순차배열을 선언합니다.

(4) 첨부파일 목록을 반복합니다.

(5) 첨부파일 목록에 개별 첨부파일 결과를 추가합니다.


뷰를 추가하겠습니다.
app/Views/view/upload_multi.php

<form method="POST" enctype="multipart/form-data">
    <p>
        멀티 파일 업로드
        <input type="file" name="files[]" multiple="multiple" /> <!-- (1) -->
    </p>
    <input type="submit" value="입력" />
    <hr />
    <?php foreach ($file_info_array as $fileInfo) : // (2) ?> 
        <hr />
        <?php foreach ($fileInfo as $key => $val) : ?>
            <p><?= $key ?> : <?= $val ?></p>
        <?php endforeach; ?>
    <?php endforeach ?>
</form>

(1) 여러 개의 파일을 선택하려면 multiple HTML 속성이 필요합니다. 또한 반드시 명심해야 할 것이 name=files[] 처럼 이름이 배열 형태여야 합니다. 만약 name=files처럼 단일 항목으로 설정되어 있는데 multiple 속성이 지정되어 여러 첨부파일이 서버에 업로드될 경우 오류가 나므로 반드시 name 속성이 []로 끝나는지 확인하세요.

(2) 컨트롤러에서 전달받은 첨부 파일 목록이 순차배열이기 때문에 하나씩 반복하면서 결과를 보여줍니다.


브라우저에서 http://localhost:8080/view/upload_multi에 접속해 결과를 확인합니다.

profile
스타트업에 관심이 많은 10 + n년차 웹 개발자. 자바 스프링 (혹은 부트), 파이썬 플라스크, PHP를 주로 다룹니다.

0개의 댓글