2009-08-23 7 views
2

Dans un seul script, je dois faire ce qui suit:Php: Comment gérer le traitement de fichiers et les opérations de téléchargement dans un seul script?

  1. créer un zip de fichiers dans un répertoire
  2. forcer le téléchargement du nouveau créer zip

Mon problème est que chaque fois que j'essaye de le faire dans un seul script, le zip téléchargé est corrompu (la taille du fichier est correcte cependant). Si je déclenche les processus dans deux appels de script distincts, le fichier zip téléchargé est correct.

Je suppose que le problème est que le processus d'enregistrement au format zip n'est pas complètement terminé avant le début du téléchargement. Etrangement, il ne résout pas le problème à insérer un sommeil (3) entre les processus ... Le code ci-dessous. Comment s'assurer que le fichier zip est complètement terminé avant que le téléchargement forcé commence?

Cordialement/Jonas

// 1. create a zip 
$createZipFile = new CreateZipFile('temp.zip'); 
$createZipFile->zipDirectory('temp/', '.'); 
$createZipFile->saveZipFile(); 

sleep(3); // <-- Doesn't matter! 

// 2. force zip download 
$fileServer = new FileServer(); 
// Line below gives a corrupted zip when run in same script as 1.  
$fileServer->forzeDownload('temp.zip'); 
+2

Essayez d'ouvrir le fichier zip corrompu dans un éditeur de texte - il peut révéler le point où quelque chose ne va pas. Les chances sont qu'il ne contienne que 404 pages (ce qui n'est pas un fichier zip bien formé, évidemment). – JorenB

+0

Vous avez probablement une sortie supplémentaire (peut-être un seul espace/saut de ligne avant le bloc PHP) qui corrompra vos données. – Gumbo

Répondre

0

Merci, JorenB et Gumbo! L'examen texteditor a révélé une sortie de débogage dans la création de zip qui n'affecte pas le zip original, mais corrompt les données envoyées au navigateur lors du téléchargement.

1

Créer le zip puis redirigent l'utilisateur vers ce fichier.

http://php.net/manual/en/function.header.php

+0

Merci Antonio, mais dans ce cas, je dois le faire en un seul processus ... – Cambiata

+0

Vous le faites en un seul processus. Vous créez déjà le fichier, utilisez simplement l'en-tête pour passer les en-têtes appropriés pour télécharger un fichier, puis utilisez le fichier readfile. Ou simplement rediriger l'utilisateur vers le fichier zip (ce qui est beaucoup plus simple) – AntonioCS

+0

SI vous faites cela, alors n'oubliez pas d'implémenter une sorte de solution qui supprime les fichiers qui ont déjà été servis. –

Questions connexes