files->get('file'); if (!$uploadedFile) { return $this->json([ ['propertyPath' => 'file', 'message' => 'Please upload a file'] ], 422); } // Validation manuelle pour éviter les règles automatiques de Symfony $errors = $this->validateFile($uploadedFile); if (!empty($errors)) { return $this->json($errors, 422); } try { // Créer la commande $command = new ConvertFileCommand( filePath: $uploadedFile->getPathname(), originalFilename: $uploadedFile->getClientOriginalName(), fileSize: $uploadedFile->getSize() ); // Exécuter la conversion $response = $this->commandHandler->handle($command); // Retourner le fichier converti $fileContent = file_get_contents($response->convertedFilePath); @unlink($response->convertedFilePath); return new Response( content: $fileContent, status: 200, headers: [ 'Content-Type' => 'application/x-cbz', 'Content-Disposition' => sprintf('attachment; filename=%s', $response->outputFilename), ] ); } catch (ConversionException $e) { return $this->json(['error' => $e->getMessage()], 400); } } private function validateFile($uploadedFile): array { $errors = []; // Vérifier si le fichier est valide if (!$uploadedFile->isValid()) { $errors[] = [ 'propertyPath' => 'file', 'message' => 'The uploaded file is not valid: ' . $uploadedFile->getErrorMessage() ]; return $errors; } // Vérifier la taille (150MB max) $maxSize = 150 * 1024 * 1024; // 150MB en bytes if ($uploadedFile->getSize() > $maxSize) { $errors[] = [ 'propertyPath' => 'file', 'message' => 'The uploaded file is too large. Allowed size is 150MB.' ]; } // Vérifier l'extension $allowedExtensions = ['cbr', 'cbz', 'zip', 'rar']; $extension = strtolower($uploadedFile->getClientOriginalExtension()); if (!in_array($extension, $allowedExtensions)) { $errors[] = [ 'propertyPath' => 'file', 'message' => 'Please upload a valid CBR or CBZ file' ]; } return $errors; } }