Bonjour à tous,
Je me permets de venir vers vous, car j'ai un problème avec mon script qui me permet de créer un ZIP, puis de télécharger le fichier.

CONTEXTE :
Le controller permet de récupérer les fichiers stockés en fonction de l'article sélectionné, lors de l'appui sur le bouton, le dossier correspondant à l'article est zippé et envoyé en téléchargement (tout en renommant le fichier). La première partie fonction, en effet, le fichier ZIP est bien créer, mais le téléchargement ne se lance pas.

J'ai testé de passer la method en GET et le fichier ZIP est bien créé et le téléchargement se lance.
Auriez-vous une idée pourquoi la method POST ne me permet pas de télécharger mon fichier ZIP avec ce script ?

show.html.twig

<form action="{{ path('zip_folder', {'id': product.id}) }}" method="POST">
    <button type="submit">Télécharger</button>
</form>

DownloadZipController.php

<?php
namespace App\Controller;

use App\Entity\Product; // Utilise ton entité Product ici
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use ZipArchive;
use RecursiveIteratorIterator;
use RecursiveDirectoryIterator;
use FilesystemIterator;

class DownloadZipController extends AbstractController // N'oublie pas de déclarer ta classe héritant de AbstractController
{
    #[Route('/zip-folder/{id}', name: 'zip_folder', methods: ['POST'])]
    public function zipFolder(Product $entity, KernelInterface $kernel): Response
    {
        $projectDir = $kernel->getProjectDir();
        $sourceDir = $projectDir . '/public/download/' . $entity->getId();
        $zipDir = $projectDir . '/var/zips/';

        // Vérification de l'existence du répertoire source
        if (!is_dir($sourceDir)) {
            throw new \Exception("Dossier source introuvable: " . $sourceDir);
        }

        // Création du répertoire de destination si nécessaire
        if (!is_dir($zipDir)) {
            mkdir($zipDir, 0777, true); // Vérifie les permissions
        }

        // Création du nom de fichier zip
        $randomName = bin2hex(random_bytes(10)) . '.zip';
        $zipPath = $zipDir . $randomName;

        // Création de l'archive zip
        $zip = new ZipArchive();
        if ($zip->open($zipPath, ZipArchive::CREATE) !== true) {
            throw new \Exception("Impossible d'ouvrir le fichier zip");
        }

        // Parcours des fichiers à zipper
        $files = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($sourceDir, FilesystemIterator::SKIP_DOTS),
            RecursiveIteratorIterator::LEAVES_ONLY
        );

        foreach ($files as $file) {
            $filePath = $file->getRealPath();
            // Optionnellement, afficher les fichiers ajoutés
            dump("Ajout du fichier : " . $filePath); // Vérifie chaque fichier ajouté
            $relativePath = substr($filePath, strlen($sourceDir) + 1);
            $zip->addFile($filePath, $relativePath);
        }

        // Fermeture de l'archive
        $zip->close();

        // Vérifie si le zip a bien été créé
        dump("Zip créé avec succès : " . $zipPath);

        // Générer un nom de fichier aléatoire pour le téléchargement
        $downloadName = bin2hex(random_bytes(10)) . '.zip';  // Nom aléatoire pour le téléchargement

        // Retourne le fichier zip pour le téléchargement
        return $this->file($zipPath, $downloadName, ResponseHeaderBag::DISPOSITION_ATTACHMENT);

    }
}

Aucune réponse