Öffnen von heruntergeladenen zip-Datei erstellt cpgz Datei?
Wenn ich die url eine zip-Datei, die href
einen link und klicken Sie auf den link, meine zip-Datei heruntergeladen, und öffnen Sie bekommt die Inhalte, die ich erwarte.
Ist hier, dass HTML:
<a href="http://mysite.com/uploads/my-archive.zip">download zip</a>
Das problem ist, ich möchte den link zu zeigen auf meine Bewerbung, so dass ich feststellen könnte, ob der Benutzer die Berechtigung zum Zugriff auf diese zip-Datei.
so, ich würde gerne mein HTML-Code dieses:
<a href="/canDownload">download zip</a>
und meine PHP für die /canDownload
Seite:
//business logic to determine if user can download
if($yesCanDownload){
$archive='https://mysite.com/uploads/my-archive.zip';
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=".basename($archive));
header("Content-Length: ".filesize($archive));
ob_clean();
flush();
echo readfile("$archive");
}
So, ich denke, das problem hat zu tun mit der header()
code, aber ich habe versucht eine Reihe von Dingen, die mit, dass basierend auf verschiedenen google-und anderen Vorschläge und keine Arbeit.
Wenn Sie meine Frage beantworten, ist es wahrscheinlich, Sie können diese Frage beantworten zu: Zip-Datei mit PHP Ergebnisse in cpgz-Datei nach der Extraktion
- Was ist eine cpgz Datei?
- Der Einfachheit halber habe ich bezeichnete es als eine cpgz-Datei, aber es ist tatsächlich ein
xxx.zip.cpgz
- Datei. Von google, ich denke, es ist ein komprimieren der zip-Datei. Es scheint, ich bin das herunterladen einer Datei, deren Inhalt nicht gelesen werden kann, vielleicht, weil die header () - Anweisungen waren bestimmt schon um/canDownload
? - Versuchen Sie, die Erweiterung zu .txt und sehen, wenn Sie nur-text in es.
- also du meinst
https://mysite.com/uploads/my-archive.txt
? - Ich meine, nachdem Sie die Datei heruntergeladen haben, ändern Sie die Erweiterung auf .txt und öffnen Sie es.
- danke @jprofitt ich denke, Sie sind auf das problem, als ich öffnete die zip-Datei als txt -, bekam ich folgende Fehlermeldung:
Cannot modify header information - headers already sent by
- Das heißt, es ist ein anderer code in Ihr Programm, das senden der Ausgabe (oder Header), bevor Sie anrufen
header()
hier. Es gibt wohl einige Fehler oder einige andere Ausgabe, bevor Sie den code, den Sie geschrieben. - ja, Sie sind richtig, der erste Fehler ist
filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for https://mysite.com/uploads/my-archive.php<
. Es sieht so ausheader() and filesize()
Probleme sind Sekundär um die eigentliche Frage, die so rufen Sie die zip-Datei von meinem s3-bucket, immer noch auf der Suche durch die AWS PHP-SDK... - Die SDK ist der Weg zu gehen; Sie können einfach kopieren Sie das Archiv vorübergehend auf dem lokalen server und bekommen dieses Problem geschlossen (dh, beseitigen Sie alle Fehler außer AWS), und dann versuchen Sie, hinzufügen von AWS-code, um die remote-Aufruf. Falls Sie noch Fragen gibt, sollten Sie öffnen eine andere Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort in meinem Fall war es eine leere Zeile ausgegeben wird, bevor readfile().
Also fügte ich hinzu:
Aber Sie sollten wahrscheinlich suchen Sie den Ort, wo diese Zeile ist die Ausgabe in deinem code.
Die PHP-Dokumentation für readfile sagt, dass es ausgegeben wird der Inhalt einer Datei und int zurückgeben.
Also dein code
echo readfile("$archive");
, echo$archive
(btw, die Anführungszeichen sind sinnlos hier; sollten Sie diese entfernen), und geben DANN dieint
wird zurückgegeben. Das heißt, dass die Zeile sollte sein:readfile($archive);
Auch, Sie werden sollte, mit einem lokalen Pfad (nicht http://link) auf das Archiv.
Insgesamt:
Schließlich, wenn das nicht funktioniert, stellen Sie sicher, dass
filesize($archive)
ist Rückkehr die genaue Länge der Datei.http://
weil Sie die zip-Datei tatsächlich auf einem remote-server. So, ja jetzt bin ich zu realisieren, readfile() macht keinen Sinn in diesem Kontext. Haben Sie irgendwelche anderen Vorschläge?/canDownload
php-Datei. Was ich habe, ist genau das, was Sie sehen. Ich bin nur zu lernen, das S3 SDK. Ich sehe, es ist ein getObject aufrufen, aber nicht sicher, wie Sie Sie zur Anpassung an meine situation. Ich bin kein totaler noob, wie kann ich den upload auf meinem S3, aber noch etwas verwirrt, vielleicht können Sie beraten?Ok, ich habe meine Frage selbst beantwortet.
Das Hauptproblem, das ich ursprünglich nicht klar, war, dass die Datei nicht gefunden wurde auf meinem Applikationsserver. Es war in einer Amazon AWS s3 bucket. Deshalb hatte ich eine komplette url in meiner Frage,
http://mysite...
und nicht nur ein Dateipfad auf dem server. Wie es sich herausstelltfopen()
kann urls öffnen (alle s3-bucket "Objekte" ein.k.ein. Dateien, urls), so dass ist, was ich Tat.Hier mein letzter code:
Andere mögliche Antwort fand ich Nach viel suchen, fand ich, dass die zwei möglichen Gründe für eine
*.zip
"entpacken", um eine*.zip.cpgz
sind:*.zip
- Datei ist beschädigthandle >2GB-Dateien
Sein ein Mac-Benutzer sind, der zweite Grund war die Ursache für mein problem entpacken der Datei: die standard-Mac-OS-tool ist Archiv-Dienstprogramm, und es kann sich offensichtlich nicht handle >2GB-Dateien. (Die Datei, die in Frage für mich war eine Zip 4GB raspbian disk-image.)
Was ich am Ende dabei war, ein Debian virtual machine, die bereits in Virtual Box auf meinem Mac.
unzip
6.0 auf Debian 8.2 hatte kein problem, entpacken Sie das Archiv.Sind Sie vorbei, die URL zu
readfile()
wie:Während Sie sollten übergeben Sie den Pfad auf dem server, zum Beispiel:
Vorausgesetzt, die Datei liegt in den Ordner hochladen.
Versuchen außerdem, die folgenden Header:
In meinem Fall, ich war beim erstellen der Datei in einem Verzeichnis public_html und die Regeln der Gastgeber hat es nicht zugelassen.