web-dev-qa-db-fra.com

Symfony2 créer et télécharger le fichier Zip

J'ai une application qui télécharge des fichiers et puis je peux compresser comme fichier Zip et télécharger.

L'action d'exportation:

public function exportAction() {
        $files = array();
        $em = $this->getDoctrine()->getManager();
        $doc = $em->getRepository('AdminDocumentBundle:Document')->findAll();
        foreach ($_POST as $p) {
            foreach ($doc as $d) {
                if ($d->getId() == $p) {
                    array_Push($files, "../web/".$d->getWebPath());
                }
            }
        }
        $Zip = new \ZipArchive();
        $zipName = 'Documents-'.time().".Zip";
        $Zip->open($zipName,  \ZipArchive::CREATE);
        foreach ($files as $f) {
            $Zip->addFromString(basename($f),  file_get_contents($f)); 
        }

        $response = new Response();
    $response->setContent(readfile("../web/".$zipName));
    $response->headers->set('Content-Type', 'application/Zip');
    $response->header('Content-disposition: attachment; filename=../web/"'.$zipName.'"');
    $response->header('Content-Length: ' . filesize("../web/" . $zipName));
    $response->readfile("../web/" . $zipName);
    return $response;
    }

tout est ok jusqu'à l'en-tête de la ligne. et chaque fois que je vais ici, j'ai le message suivant: "Avertissement: readfile (../ web/Documents-1385648213.Zip): impossible d'ouvrir le flux: aucun fichier ni répertoire de ce type"

Qu'est-ce qui ne va pas?

et pourquoi, lorsque je télécharge les fichiers, ces fichiers ont des autorisations racine et il en va de même pour le fichier Zip que je crée.

13
BrunoRamalho

résolu:

$Zip->close();
header('Content-Type', 'application/Zip');
header('Content-disposition: attachment; filename="' . $zipName . '"');
header('Content-Length: ' . filesize($zipName));
readfile($zipName);

apparemment fermer le fichier est important;)

8
BrunoRamalho

Exemple de SYMFONY 3:

public function zipDownloadAllDocumentAction($documents)
{
    $files = array();
    $em = $this->getDoctrine()->getManager();

    foreach ($documents as $d) {
        array_Push($files, "../web/" . $d->getWebPath());
    }

    $Zip = new \ZipArchive();
    $zipName = 'Documents_' . time() . ".Zip";
    $Zip->open($zipName,  \ZipArchive::CREATE);
    foreach ($files as $f) {
        $Zip->addFromString(basename($f),  file_get_contents($f));
    }
    $Zip->close();

    $response = new Response(file_get_contents($zipName));
    $response->headers->set('Content-Type', 'application/Zip');
    $response->headers->set('Content-Disposition', 'attachment;filename="' . $zipName . '"');
    $response->headers->set('Content-length', filesize($zipName));

    return $response;
}
15
vincent

Il est tard mais peut-être sera-t-il utile à quelqu'un d'autre

http://symfony.com/doc/2.3/components/http_foundation/introduction.html#serving-files

2
seltzlab

Pour compléter la réponse de vincent, ajoutez simplement ce droit avant de renvoyer la réponse:

...
$response->headers->set('Content-length', filesize($zipName));

unlink($zipName);

return $response;
0

Depuis Symfony 3.2+ pouvez utiliser assistant de fichier pour permettre le téléchargement de fichier dans le navigateur:

public function someAction()
{
    // create Zip file
    $Zip = ...;

    $this->file($Zip);    
}
0
Tomáš Votruba

Je pense que c'est mieux que tu utilises

$zipFilesIds = $request->request->get('zipFiles')
foreach($zipFilesIds as $zipFilesId){
  //your vérification here 
}

avec la variable post de votre identifiant de Zip = 'zipFiles'. Il vaut mieux récupérer toutes les variables $ _POST.

0
Amine