diff --git a/app/Controllers/ClaimController.php b/app/Controllers/ClaimController.php index 6940d90..6e8b551 100644 --- a/app/Controllers/ClaimController.php +++ b/app/Controllers/ClaimController.php @@ -503,23 +503,59 @@ class ClaimController extends ResourceController private function collectClaimUploadFiles(): array { $filesToProcess = []; + $candidates = []; $multiple = $this->request->getFileMultiple('claim_files'); if (!empty($multiple)) { - foreach ($multiple as $uploadedFile) { - if ($this->isValidUploadFile($uploadedFile)) { - $filesToProcess[] = $uploadedFile; - } - } - return $filesToProcess; + $candidates[] = $multiple; } $single = $this->request->getFile('claim_files'); - if ($this->isValidUploadFile($single)) { - $filesToProcess[] = $single; + if ($single !== null) { + $candidates[] = $single; } - return $filesToProcess; + $allFiles = $this->request->getFiles(); + if (!empty($allFiles['claim_files'])) { + $candidates[] = $allFiles['claim_files']; + } + + foreach ($candidates as $candidate) { + foreach ($this->flattenUploadedFiles($candidate) as $uploadedFile) { + if (!$this->isValidUploadFile($uploadedFile)) { + continue; + } + + // Deduplicate by temp path (same file reference can appear in multiple sources). + $filesToProcess[$uploadedFile->getTempName()] = $uploadedFile; + } + } + + return array_values($filesToProcess); + } + + /** + * Recursively extract UploadedFile instances from nested upload arrays. + * + * @param mixed $files + * @return list<\CodeIgniter\HTTP\Files\UploadedFile> + */ + private function flattenUploadedFiles($files): array + { + if ($files instanceof \CodeIgniter\HTTP\Files\UploadedFile) { + return [$files]; + } + + if (!is_array($files)) { + return []; + } + + $result = []; + foreach ($files as $file) { + $result = array_merge($result, $this->flattenUploadedFiles($file)); + } + + return $result; } private function isValidUploadFile($uploadedFile): bool @@ -548,22 +584,27 @@ class ClaimController extends ResourceController foreach ($filesToProcess as $file) { try { - $storedName = time() . '_' . $file->getRandomName(); + $clientName = $file->getClientName(); + $clientExt = $file->getClientExtension(); + $clientMime = $file->getClientMimeType(); + $storedName = $file->getRandomName(); if (!$file->move($uploadPath, $storedName)) { $result['errors'][] = $file->getErrorString() ?: 'Unable to move uploaded file'; continue; } - if (!$this->ClaimFilesModel->insert([ + $inserted = $this->ClaimFilesModel->insert([ 'claim_id' => $claimId, - 'file_name' => $file->getClientName() ?: $storedName, + 'file_name' => $clientName ?: $storedName, 'file_path' => self::CLAIM_UPLOAD_DIR . $storedName, - 'file_extension' => $file->getClientExtension(), - 'file_mime_type' => $file->getClientMimeType(), + 'file_extension' => $clientExt, + 'file_mime_type' => $clientMime, 'is_active' => 1, 'created_by' => $createdBy, - ])) { + ]); + + if ($inserted === false) { if (is_file($uploadPath . $storedName)) { unlink($uploadPath . $storedName); }