Ich muss einen Download einer ZIP-Datei auslösen (Die Zip-Datei befindet sich in meinem Datenordner). Dafür benutze ich den Code,
%Vor%Dies funktioniert in Core PHP wie erwartet. Aber wenn ich den gleichen Code benutze, druckt Zend einen Inhalt wie unten,
PKYsVJ)~�� study.xlsPKYsVJs�����+
tutorial-point-Export.xlsPKYsVJn��� 8��Zabc.xlsP
Zwischen den Inhalten kann ich den Namen aller Dateien in der Zip sehen. Aber es wird nicht heruntergeladen.
Nachdem ich gemerkt habe, dass dies nicht funktioniert, habe ich angefangen, danach zu suchen und eine Lösung aus Stack over Flow gefunden.
Probieren Sie 1 aus: Hinzufügen von verschiedenen Header-Elementen und ob
-Funktionen in jeder beliebigen Zeile
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . $file_size);
ob_start();
ob_clean();
flush();
Alle diese werden aus verschiedenen Stack-Überlauf Fragen und Antworten versucht und haben das gleiche Ergebnis
Versuchen Sie 2: PHP liest stattdessen die Datei herunterladen . Diese Frage hat keine akzeptierte Antwort (Er fragte nach dem Kernphp, aber ich habe das gleiche Problem nur mit Zend). Ich habe alles versucht, aber es hat nicht funktioniert.
Versuchen Sie es mit 3: Ändern des .htaccess . Danach dachte ich, es wäre ein Problem mit meinem .htaccess und diese Antwort zum Ändern der .htaccess-Datei gefunden.
%Vor%Dies gab mir auch das gleiche Ergebnis.
4: Download-Funktionen in Zend verwenden . Ich habe die ganzen Zend-Funktionen in der Antwort auf diese Frage ausprobiert. Aber gab mir eine leere Ausgabe, selbst die Datei wurde nicht gelesen.
5: Entfernen Sie alle unerwünschten Leerzeichen vor und nach dem php-Tag gemäß der Antwort
Gibt es eine andere Möglichkeit, einen Download im ZF2-Framework auszulösen?
BEARBEITEN
Unten ist meine genaue Funktion. Dies ist GET (API) -Funktion,
%Vor%Basierend auf dieser SO Antwort können Sie die folgenden Änderungen an Ihrer Funktion vornehmen .
%Vor%Wenn Sie die Großschreibung der Header korrigieren, funktioniert es? dh verwenden Sie Content-Disposition und Content-Type jeweils über Content-Disposition und Content-Type?
Ungeachtet dessen würde ich als Standard-Debugging-Technik vorschlagen, Ihre Browser-Dev-Tools zu verwenden, um die Anforderungen zu prüfen (inc-Header) und dies mit dem zu vergleichen, was in Ihrem serverseitigen Code steht und was in der serverseitigen Antwort und ist was endet im Kunden. Ich würde dies auch mit einer privaten Sitzung (Incognito-Modus in Chrome usw.) oder einer neuen Profil- / VM-Installation bestätigen, um sonst noch etwas zu eliminieren.
Außerdem sollten Sie xsendfile nicht verwenden und die Verantwortung für das Senden der Datei an den Webserver delegieren, damit Sie nicht die Verantwortung übernehmen in Ihrem PHP-Code? Sie können dies mit der entsprechenden Serverkonfiguration tun (manchmal über .htaccess, aber heutzutage haben Sie sicherlich die volle Kontrolle) und dann setzen Sie einfach den X-Sendfile
Header wie im obigen Link:
Weil Sie JsonModel
zurückgeben, wird Ihre Ausgabe ein json mit Ihrer Nachricht sein, anstatt sie zu puffern.
Bearbeiten: Ich habe bemerkt, dass Sie Content-Transfer-Encoding: Binary
, getestet auf meinem os x - php5.6
env., vermisst haben.
Sie sollten das versuchen
%Vor%Entfernen Sie einfach Ihr JSonModel bei der Antwort.
Hier gibt es zwei Probleme:
Beide zeigen auf einen Content-Type
Fehler. Vergewissern Sie sich, dass% code_% vom Browser empfangen korrekt ist (anstatt als Content-Type
umgeschrieben zu werden).
Wenn dies der Fall ist, ändern Sie es in text/html
. Dies funktioniert möglicherweise nicht im Internet Explorer, der ein aggressives Sniffing vom Typ Inhalt durchführt. Sie könnten versuchen, eine nosniff -Direktive hinzuzufügen.
Zusätzlich, nach einem application/x-download
(und Sie könnten gezwungen sein, den Inhalt der Datei anstelle von readfile () zurückzugeben - also readfile
), sollten Sie alle Ausgaben mit% stoppen Code%. Das ZIP-Dateiverzeichnis befindet sich ganz am Ende. Wenn Sie also eine JSON-Nachricht anhängen, riskieren Sie, dass der Browser die Datei weder lädt noch korrekt anzeigt.
Als letzten Ausweg kannst du nuklear werden und alles selbst machen. Extrem nicht elegant, und alle Frameworks sollten eine Alternative bieten, aber nur für den Fall ...
%Vor%Es ist möglich , dass eine kreative Verwendung von Atexit-Handlern oder Destruktor-Hooks selbst diese letzte Option in Unordnung bringen kann, aber ich halte das für unwahrscheinlich.
Sie können dies zum Herunterladen der Datei anstelle von readfile () versuchen;
Serverseite -
file_put_contents("file.zip", fopen("http://someurl/file.zip", 'r'));
Kundenseite -
%Code%
<a href="http://someurl/file.zip"><button>download file</button></a>
Tags und Links php zend-framework .htaccess