readfile () Funktion lies die Zip-Datei anstatt sie herunterzuladen (Zend)

8

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%     
Kuttoozz 23.02.2017, 11:04
quelle

6 Antworten

0

Basierend auf dieser SO Antwort können Sie die folgenden Änderungen an Ihrer Funktion vornehmen .

%Vor%     
Peter Darmis 28.02.2017 12:58
quelle
0

Das hat für mich funktioniert!

%Vor%     
Muhammad Athar 04.03.2017 20:29
quelle
0

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:

%Vor%     
James Fry 06.03.2017 00:07
quelle
0

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.

    
Đào Minh Hạt 06.03.2017 03:31
quelle
0

Hier gibt es zwei Probleme:

  • Ihr Browser versucht, die Datei zu öffnen, anstatt sie herunterzuladen.
  • auch, es öffnet die Datei nicht korrekt.

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.

    
LSerni 02.03.2017 21:57
quelle
-1

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>

    
Rishabh Chaudhary 27.02.2017 07:44
quelle

Tags und Links