isValid()) { throw new \InvalidArgumentException('Invalid receipt upload.'); } $allowed = [ 'image/jpeg' => 'jpg', 'image/png' => 'png', 'image/webp' => 'webp', 'application/pdf' => 'pdf', ]; $mime = strtolower((string) $file->getMimeType()); if (! isset($allowed[$mime])) { throw new \InvalidArgumentException('Unsupported receipt file type.'); } if ((int) $file->getSize() > 5 * 1024 * 1024) { throw new \InvalidArgumentException('Receipt file too large. Max 5MB.'); } $filename = bin2hex(random_bytes(16)).'.'.$allowed[$mime]; $file->storeAs('receipts', $filename); return $filename; } public function receiptUrl(?string $filename): ?string { return $this->urls->forReceiptStorage($filename); } }