2009-08-23 7 views
2

In einem einzigen Skript, muss ich folgendes tun:PHP: Wie gehen Dateiverarbeitungs- und Download-Vorgänge in einem einzigen Skript vor?

  1. erstellen zip aus Dateien in einem Verzeichnis
  2. Kraft der Download des neu erstellen zip

Mein Problem ist, dass Immer, wenn ich versuche, dies in einem einzigen Skript zu tun, die heruntergeladene zip ist beschädigt (Dateigröße ist in Ordnung, obwohl). Wenn ich die Prozesse in zwei separaten Skriptaufrufen auslöst, ist die heruntergeladene ZIP in Ordnung.

Ich vermute, dass das Problem ist, dass die Zip-Speichern in Datei-Prozess ist nicht vollständig fertig, bevor der Download beginnt. Seltsamerweise löst es das Problem nicht fügen Sie einen Schlaf (3) zwischen den Prozessen ... Code Gliederung unten.

Wie kann sichergestellt werden, dass die Zip-Datei vollständig fertig ist, bevor der Force-Download gestartet wird?

Grüße/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

Versuchen Sie, die beschädigte Zip-Datei in einem Texteditor zu öffnen - es kann den Punkt offenbaren, an dem etwas schief geht. Es besteht die Möglichkeit, dass es nur eine 404-Seite enthält (was offensichtlich keine gut formatierte Zip-Datei ist). – JorenB

+0

Sie haben wahrscheinlich eine zusätzliche Ausgabe (möglicherweise ein Leerzeichen/Zeilenumbruch vor dem PHP-Block), die Ihre Daten beschädigt. – Gumbo

Antwort

0

Danke, JorenB und Gumbo! Die Texteditor-Untersuchung ergab einige Debug-Ausgaben bei der Zip-Erstellung, die keinen Einfluss auf die Orignial-Zip-Datei haben, sondern die Daten korrumpieren, die beim Herunterladen an den Browser gesendet werden.

1

die Zip erstellen und dann auf diese Datei den Benutzer umleiten.

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

+0

Danke Antonio, aber in diesem Fall muss ich es in einem einzigen Prozess tun ... – Cambiata

+0

Sie tun es in einem einzigen Prozess. Sie erstellen die Datei bereits, verwenden Sie einfach die Kopfzeile, um die entsprechenden Kopfzeilen zum Herunterladen einer Datei zu übergeben, und verwenden Sie dann readfile. Oder leiten Sie den Benutzer einfach in die Zip-Datei um (was viel einfacher ist). – AntonioCS

+0

Wenn Sie das tun, dann vergessen Sie nicht, eine Art von Lösung zu implementieren, die Dateien löscht, die bereits geliefert wurden. –