Zipper à la volée avec PHP (suite)

Résolu/Fermé
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 14 déc. 2015 à 00:09
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 15 déc. 2015 à 00:31
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 vendredi 2 novembre 2012 Statut Membre Dernière intervention 17 décembre 2015 126
14 déc. 2015 à 13:04
(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 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
15 déc. 2015 à 00:31
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 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
14 déc. 2015 à 13:23
'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