it-swarm.com.de

Symfony2-Zip-Datei erstellen und herunterladen

Ich habe eine Anwendung, die einige Dateien hochlädt und dann als ZIP-Datei komprimieren und herunterladen kann.

Die Exportaktion:

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;
    }

alles ist in ordnung bis zum zeilenkopf. und jedes Mal, wenn ich hier bin, habe ich die Fehlermeldung erhalten: "Warnung: readfile (../ web/Documents-1385648213.Zip): Stream konnte nicht geöffnet werden: Keine solche Datei oder Verzeichnis

Was ist falsch?

und warum, wenn ich die Dateien hochlade, diese Dateien über Root-Berechtigungen verfügen, und dasselbe gilt für die von mir erstellte Zip-Datei.

13
BrunoRamalho

gelöst:

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

anscheinend ist das Schließen der Datei wichtig;)

8
BrunoRamalho

SYMFONY 3 Beispiel:

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

Es ist spät, aber vielleicht wird es jemand anderem nützlich sein

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

2
seltzlab

Um die Antwort von vincent zu vervollständigen, fügen Sie diese einfach vor der Antwort hinzu:

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

unlink($zipName);

return $response;
0

Da Symfony 3.2+ kann Dateihilfe verwenden, um das Herunterladen von Dateien im Browser zu ermöglichen:

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

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

Ich denke, es ist besser, dass Sie verwenden

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

mit der Post-Variable Ihrer ID von Zip = 'zipFiles'. Es ist besser, alle $ _POST-Variablen abzurufen.

0
Amine