Frage

Ich versuche, den folgenden Code zu verwenden, um eine Zip-Datei aus einem Verzeichnis zu erstellen und es den Benutzer über einen HTTP-Download dienen:

 // write the file
file_put_contents($path . "/index.html", $output);

// zip up the contents
chdir($path);
exec("zip -r {$course->name} ./");

$filename = "{$course->name}.zip";

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' .urlencode($filename));
header('Content-Transfer-Encoding: binary');

readfile($filename);

Ich bin in der Lage die Zip-Datei zu erstellen, aber es über http Download funktioniert nicht. Wenn ich die Zip-Datei herunterladen, die ein FTP-Client dann Mac StuffIt Expander erstellt werden mit packen die Dateien nur in Ordnung, aber wenn ich es über HTTP-Download, erstellt der mac Entpacker eine Endlosschleife. Was ich damit meine ist, sagen, dass die Datei, die ich herunterladen wird course.zip genannt, dann die Datei gibt course.zip.cpgz Entpacken und die Datei entpackt gibt course.zip again..and weiter und weiter.

Wer irgendwelche Ideen?

Danke!

War es hilfreich?

Lösung

  1. Re-zippen es jedesmal, wenn es angefordert wird, ist keine gute Idee. Versuchen Sie, dass nur dann, wenn die ZIP-Datei nicht bereits vorhanden ist.

  2. Wenn eine flüchtige Datei oder nur eine einzelne kleine Datei, die Sie komprimiert übertragen mögen, versuchen Sie sich mit ob_start('ob_gzhandler') stattdessen simplier, kleinen, sauberen. Die Datei wird übertragen komprimiert, aber es wird in seinem ursprünglichen Format von der Client-Seite.

  3. gespeichert
  4. die Content-Length-Header angeben benötigte den Downloader zu ermöglichen, das Ende der Datei zu kennen, so dass Fortschrittskontrolle, Aufdeckung von Korruption der Datei und den Dreh der HTTP-Sitzung zu vermeiden (wenn Verbindung in Keep -Alive-Modus), vielleicht der Mangel an diesem Header ist die Wurzel des Problems.

Andere Tipps

hatte ich dieses Problem und es stellte sich heraus, die heruntergeladene ZIP-Datei eine neue Zeile am Anfang eingeführt hatte.

Gelöst von ob_clean und bündig Funktionen mit

    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=".basename($archive_file_name));
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize($archive_file_name));
    ob_clean();
    flush();
    echo readfile("$archive_file_name");

Wie vorgeschlagen von karim79 , werde ich meinen Kommentar als Antwort setzen: Was passiert, wenn Sie den MIME-Typ ändern von application / octet-stream auf application / zip?

Auch ich sehe, dass Sie mit einer Zip-Programm-Befehlszeile, aber Sie überprüfen nicht für den Erfolg des Reißverschlusses, und auch nicht überprüfen, ob die Datei, bevor Sie existiert es den Endbenutzer-Browser zu senden, . Versuchen harte Kodierung einen Dateinamen, manuell Reißverschluss mit einer richtig gebildet Zip-Datei zu gewährleisten, und dann sehen, ob Sie den Code, um sie Ihren Browser spuckt richtig.

Was Sie sehen, ist, dass der Archiv-Dienstprogramm wird die Zip-Datei als Zip-Datei nicht zu erkennen und versuchte, die Zip-Archiv selbst zippen. Die zweite Operation unzips einfach die erste Datei erstellt, also eigentlich überhaupt nicht um die Datei zu öffnen. Dies ist auf die zip beschädigt werden.

Es ist möglich, dass der Browser irgendwie die Zip-Datei (Newline Konvertierungen anyone?) Während des Download-Vorgangs verstümmelt. Wie bereits erwähnt, überprüfen Sie die Art Pantomime und verwendet den PHP header () den korrekten MIME-Typen festgelegt (application / zip).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top