download-probleme von pdf's mit älteren android-versionen (ab 4)
trunx
- download
- html
- php
Hallo Freunde der digitalen Kunst,
leider muss ich mich mal wieder mit einem Problem zu Wort melden, dass mir jetzt seit Tagen Zeit und Nerven raubt. Wie im Betreff zu lesen, geht es dabei um pdf-Downloads mit älteren Android-Versionen (ich teste es mit Android 4.2.2). Der Download startet zwar, aber wird letztlich nicht ausgeführt, es erscheint in der Downloadliste ein "<Unbenannt>" bzw. ein "<Unbekannt>" mit nicht endendem Fortschrittsbalken. Diese pdf's biete ich selbst an.
Prinzipiell gibt es aber diverse andere, nicht von mir gemachte Seiten, bei denen der Download funktioniert, sprich das Problem liegt also bei mir.
Es handelt sich bei den pdf's sowohl um statische als auch um dynamisch erzeugte Dateien. Die HTML-Auszeichnung ist dabei zunächst
<a href="beispiel.pdf" download="beispiel.pdf">Beispiel</a>
Ob mit "download"-Attribut oder nicht, beide Möglichkeiten funktionieren nicht.
Auf dieser Seite habe ich gefunden, dass es sich wohl um ein header-Problem handelt. Daher habe ich, da ich ohnehin dynamische pdf's anbiete, den Download-Vorgang geteilt - eine html-Seite, die eine php-Seite aufruft. Das HTML sieht nun wie folgt aus:
<a href="pdf.php?f=beispiel" download="beispiel.pdf">Beispiel</a>
und die pdf.php
<?php
$file = $_REQUEST['f'].".pdf";
if (file_exists($file)) {
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$file.'"');
header('Content-Length: ' . filesize($file));
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Pragma: no-cache');
readfile($file);
exit;
}
?>
Dabei habe ich sowohl die im obigen Link angebenen header ausprobiert als auch die von Seiten, bei denen der Download funktioniert.
Das besonders Ärgerliche ist, dass ich vor ca. einem halben Jahr bereits vor diesem Problem stand, es gelöst habe, aber durch eine wordpress-Aktualisierung wieder verloren habe. Sprich, ich weiss, dass es irgendwie geht.
Was ich ebenfalls ausprobiert habe, ist eine Ausgabepufferung in der php-Datei. Auch ohne Erfolg.
Vielleicht war ja jemand von euch ebenfalls mit diesem Problem konfrontiert und hat eine funktionierende Lösung gefunden und kann mir damit weiter helfen.
vielen Dank und ansonsten ein schönes Wochenende
trunx
Hallo trunx,
guck mal hier unter PDF.
Ein PDF ist zwar auch ein octet-stream, aber es gibt einen besseren MIME-Typ dafür. HDH
Rolf
Hallo Rolf,
danke für deine Nachricht. Welchen MIME-Typ meinst du konkret? Download-Links haben mit dem download-Attribut den MIME-Type application/force-download, ohne diese Attribut den Typ application/pdf. Und wie oben geschrieben funktioniert beides nicht. Auch nicht, wenn ich diese header in der php-Datei explizit setze.
Was natürlich ein Problem ist, ich weiss eigentlich nicht genau, welche header der jeweilige Server selber noch setzt bzw. von den gesetzten aus eigenen Stücken weglässt. Gibt es eine Möglichkeit, das für den android-browser zu prüfen? Für Firefox gibt es ja die Erweiterung http-live-headers und nur mit der schaue ich mir die header an.
bye trunx
Hallo trunx,
dass Du es mit application/pdf bereits probiert hast, habe ich aus deinem Beitrag nicht herausgelesen. Ich habe selbst eine (firmeninterne) Anwendung in Betrieb, die PDFs ausliefert; da verwende ich application/pdf. Die Anzeige erfolgt allerdings in einem eigenen Tab des Browsers. Was ich da genau setze habe ich nicht im Kopf, das kann ich am Montag nachschauen. Und natürlich ist diese Seite nicht für Android gemacht...
Das download-Attribut wird übrigens erst ab Android 4.4 unterstützt, siehe hier. Du musst es also mit Headern lösen.
Welche Header tatsächlich ankommen, siehst Du im Netzwerk-Tab der Entwicklerwerkzeuge deines Browsers - die Du unter Android 4.2 natürlich nicht hast 😕. Aber deinem Script sollte es egal sein, welcher Client es ist, d.h. die Kontrolle der Header sollte auch vom PC aus gehen.
Content-Disposition ist übrigens ein Feld das nicht zum HTTP Standard gehört, sondern eine geduldete und verbreitete Erweiterung darstellt. Bist Du sicher, dass Android 4.2 das unterstützt? Ich habe kein Gerät zum Testen da.
Rolf
Hallo Rolf,
danke, dass du nochmal geantwortet hast.
Ich weiss auf jeden Fall, dass Android schon ab Version 2 Content-Disposition unterstützt (siehe Link im Eingangspost) und ich weiss, wie gesagt auch, dass das Ganze bei mir auch schonmal funktioniert hat. Ich bin jetzt dabei ein Script zu schreiben, dass durch alle Kombinationen von headern läuft - eine davon funktioniert dann hoffentlich.
also danke nochmal und wenn du Montag mal in dein Script schaust, wär das toll 😀
ein schönes Wochenende noch
bye trunx
so, für alle Interessierte,
ich habe zumindest herausbekommen, dass das eher ein Problem mit der Server-Konfiguration ist.
also so, wie ich das schon vermutet habe.
bye trunx
so, für alle Interessierte,
ich habe zumindest herausbekommen, dass das eher ein Problem mit der Server-Konfiguration ist.
Also so, wie ich das schon vermutet habe. Konkret funktionieren die Downloads bei http, nicht jedoch bei https.
bye trunx