Zipper à la volée avec PHP (suite)

Résolu
heliconius Messages postés 539 Date d'inscription   Statut Membre Dernière intervention   -  
heliconius Messages postés 539 Date d'inscription   Statut Membre Dernière intervention   -
Bonsoir,

@Nhay vient de me fournir les indications pour créer un fichier ZIP structuré exactement comme je le souhaitais. J'ai testé avec le code suivant :
<html>

<head>
<title></title>
</head>

<body>
<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
    $zip->addFromString('test1.txt', 'contenu du fichier ici');
    $zip->addFromString('dir/test2.txt', 'contenu du fichier ici');
    $zip->close();
    echo 'ok';
} else {
    echo 'échec';
}
?>
</body>
</html>

Ce code produit le fichier suivant :
Archive:  test.zip
Length Date Time Name
--------- ---------- ----- ----
22 2015-12-13 22:54 test1.txt
22 2015-12-13 22:54 dir/test2.txt
--------- -------
44 2 files


C'est "pile-poil" ce que je voulais à une toute petite différence près. Dans le code ci-dessus, le fichier test.zip est physiquement créé dans le répertoire du script. Or pour ma part, je souhaitais non pas en faire un zip sur le disque mais un zip proposé au téléchargement comme dans l'envoi d'un fichier texte à télécharger tel que ci-dessous :

header("Content-disposition: filename=test.zip");
header("Content-Type: application/force-download");
header("Content-type: application/octet-stream");
header("Pragma: no-cache");
header("Expires: 0");
// ... ici envoi du fichier zip ...
die();

Comment pourrait-on faire ? Merci.


A voir également:

2 réponses

Nhay Messages postés 838 Date d'inscription   Statut Membre Dernière intervention   126
 
(re)bonjour,
Du coup, un petit readfile sur le zip créer et le tour est joué !
Il sera peut-être nécessaire de mettre un header Content-length que tu peut remplir avec filesize

Si ensuite tu n'a pas besoin du zip sur ton serveur, supprime le avec unlink.

PS : Du coup,petit rappel, pas de code html avant des header
PS 2 : pour le nom de fichier sur le serveur, tu peut te servir de tempnam pour obtenir un nom temporaire et unique, ça évitera des soucis si deux personnes accède à ton script en même temps.
1
heliconius Messages postés 539 Date d'inscription   Statut Membre Dernière intervention   142
 
Merci pour ta réponse. J'avais effectivement pensé à créer le fichier sur le disque puis l'envoyer mais je me demandais, le hasard étant facétieux, quel serait le résultat si deux personnes accédaient au script en même temps, mais tu m'apportes la réponse sur un plateau.

Ok et merci @gravgun pour l'utilisation de /tmp ou autre tmpfs car mon serveur est effectivement sous GNU Debian/Linux.

En fait, ce besoin est lié à la création d'ebooks (au format epub) qui ne sont ni plus ni moins que des pages xhtml zippées dans une structure de répertoires avec extension epub. La finalité est donc : parcours d'une base de données, création des pages, zippage et envoi par téléchargement. Il me manquait les deux dernières étapes. Merci à vous deux. Question résolue. Encore merci.
0
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
'lut, pour complémenter la réponse de Nhay:

ZipArchive ne peux pas marcher uniquement en mémoire, il a besoin d'un espace sur un système de fichier.
Écrire directement sur le disque tue la performance, mais si ton serveur où PHP tourne est sous Linux, arrange-toi pour écrire dans
/tmp
,
/dev/shm
ou tout autre point de montage d'un
tmpfs
pour que les opérations soient réalisées en mémoire plutôt que physiquement.
1