코드이그나이터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에 접속해 결과를 확인합니다.