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