src/Controller/Api/DownloadLettersOrganizationController.php line 34

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\Service\LetterFilesService;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Evo\Infrastructure\MappingORM\Letter;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\HeaderUtils;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\HttpFoundation\StreamedResponse;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. class DownloadLettersOrganizationController extends AbstractController
  13. {
  14.     private EntityManagerInterface $entityManager;
  15.     private LetterFilesService $letterFilesService;
  16.     public function __construct(EntityManagerInterface $entityManagerLetterFilesService $letterFilesService)
  17.     {
  18.         $this->entityManager $entityManager;
  19.         $this->letterFilesService $letterFilesService;
  20.     }
  21. /**
  22.  * @Route("/organizations/{id}/download/letters", name="app_organization_letters_download", methods={"GET"})
  23.  */
  24. public function getAllLettersForOrganizationId(Request $requeststring $id): Response
  25. {
  26.     $this->denyAccessUnlessGranted('ROLE_ADMIN');
  27.     $queryLetterIds $request->query->get('letterIds', []);
  28.     $idsArray = isset($queryLetterIds[0]) ? explode(','$queryLetterIds[0]) : [];
  29.     /** @var \Iterator<Letter> $letters */
  30.     $letterRepo $this->entityManager->getRepository(Letter::class);
  31.     $letters $letterRepo->getLettersForDownloadForOrganizationId($id$idsArray);
  32.     // Vérifier si la liste de lettres est vide
  33.     if (!iterator_count($letterRepo->getLettersForDownloadForOrganizationId($id$idsArray))) {
  34.         return new Response('File not found'Response::HTTP_NOT_FOUND);
  35.     }
  36.     // Stream the zip directly to the output
  37.     $response = new StreamedResponse(function () use ($letters$id) {
  38.         $zip = new \ZipArchive();
  39.         $zipFilename tempnam(sys_get_temp_dir(), 'zip');
  40.         if (true === $zip->open($zipFilename, \ZipArchive::CREATE | \ZipArchive::OVERWRITE)) {
  41.             foreach ($letters as $letter) {
  42.                 if ($letter['contentPathAWS'] && $this->letterFilesService->isFileExist($letter['contentPathAWS'])) {
  43.                     $splitPath explode('/'$letter['contentPathAWS']);
  44.                     $slug end($splitPath);
  45.                     // Ajouter le fichier directement au zip en mémoire
  46.                     $zip->addFromString('courriers_'.$id.'/'.$slug$this->letterFilesService->read($letter['contentPathAWS']));
  47.                 }
  48.             }
  49.             $zip->close();
  50.         }
  51.         // Lire et streamer le contenu du zip directement
  52.         readfile($zipFilename);
  53.         unlink($zipFilename);  // Supprimer le fichier temporaire
  54.     });
  55.     $response->headers->set('Content-Type''application/zip');
  56.     $response->headers->set('Content-Disposition'HeaderUtils::makeDisposition(
  57.         HeaderUtils::DISPOSITION_ATTACHMENT,
  58.         $id.'_letters.zip'
  59.     ));
  60.     return $response;
  61. }
  62. }