ZIP-Archiv gesendet von PHP ist beschädigt
Ich bin php ZipArchive erstellen Sie eine zip-Datei on-the-fly und senden Sie es zurück an den Benutzer. Ich vorübergehend speichern Sie die Zip-Datei in einen Ordner oberhalb von document-root und dann schicken Sie es zurück mit dem code
header('Content-type:application/zip');
header('Content-Disposition: inline; filename="'.("file.zip").'"');
header("Content-Transfer-Encoding: binary");
header("Content-Length:".filesize($file));
$fh = fopen($file,'rb');
fpassthru($fh);
nachdem Sie zuvor ausgestellt, ein
$zip->close()
um sicherzustellen, dass die Datei nicht geöffnet. Die Frage, die ich habe, laufen in dieser - die gespeicherte zip-Datei ist ein gültiges Archiv, die ich öffnen kann in Windows 7, 7Zip, WinZIP etc. Allerdings, wenn ich senden Sie die Datei mit obigen code, es endet mit einem 0xD 0xA-pair-Mädchen an den Beginn der Datei, das ist genug zu machen, es ist beschädigt. Ich kann nicht herausfinden, wo diese Zeichen herkommen. Ist das ein bekannter Fehler mit fopen/fpassthru? Jede Hilfe wäre sehr geschätzt werden.
- Tipp: es gibt
readfile
, um die Ausgabe-Datei direkt... - Wirkt sich das hinzufügen einer
fclose($fh); exit();
am Ende helfen? - Auch Sie sind sicher es gibt keinen anderen Ausgang? Eine Stückliste der PHP-Datei selbst? Alle whitespace-Zeichen?
- Sie kam sehr nahe Deceze - siehe mein Kommentar unten. Wenn Sie hatte geantwortet statt kommentiert, vielleicht habe ich auch akzeptiert die Antwort. Ich hätte nicht gedacht, dass eine zusätzliche Zeile nach einer Kündigung ?> in einer gewünschten Skript würde dazu führen, so viel Mühe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was bedeutet vollständige Skript Aussehen?
Generell sollten Sie entfernen Sie alle schließen PHP tags am Ende Ihrer Skript-Dateien, wie es wahrscheinlich Ausgabe kommen aus dem Ende Ihres Skripts oder einer Skript enthalten.
Ich fand beim entfernen der
header("Content-Length:".filesize($file));
Linie ist es meine Feste gleiche problem...Nachdem viele versucht die zip-Datei herunterladen, die Lösung war:
ob_clean()
undob_end_flush()
aber es gibt mir leere zip-Datei.Danke @_on !
Sie hat mir geholfen, mit diesen Informationen.
Aber anstatt zu entfernen
header ("Content-Length:". Filesize ($ file)) ;
fügte ich einen Zeilenumbruch "\\n", verlassen:Und die Datei erzeugt, deren Größe zur Unterstützung im download
Okay dann.
Tks