Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Dateien mit Content-type & Dateiname (https://www.delphipraxis.net/31842-%5Bphp%5D-dateien-mit-content-type-dateiname.html)

Chewie 14. Okt 2004 17:15


[PHP] Dateien mit Content-type & Dateiname
 
Ich will in einem passwortgeschützten Bereich Dateien zum Download anbieten. Dafür erzeuge ich einen Header und schreibe die Datei dann in die Standardausgabe. ich will nun haben, dass der Content-type mitgesendet wird, die Datei aber, wenn man sie herunterlädt, den Namen erhalten soll, den ich vorgeb, und nicht intern.php.pdf (z.B.). Eines davon schaff ich, aber nicht beides. Geht das irgendwie? Ich will nur ungern zwei verschiedene Links anbieten.

So sieht mein Header aus (für PDF):

Code:
header("Content-type: application/pdf"); //falscher Dateiname
header("Content-disposition: attachment; filename=$filename"); //so gehts nicht im Browser zu öffnen
In $filename steht mein Dateiname drin. Gibts ne Möglichkeit, beides zu kombinieren?

Dax 14. Okt 2004 17:18

Re: [PHP] Dateien mit Content-type & Dateiname
 
Versuch's doch mal mit
Code:
Content-Type: inline

Chewie 14. Okt 2004 17:47

Re: [PHP] Dateien mit Content-type & Dateiname
 
In Kombination mit was? Wenn ich ja den Content-type PDF nicht angeb, dann wird die Datei ja nicht als PDF geöffnet.

Dax 14. Okt 2004 17:49

Re: [PHP] Dateien mit Content-type & Dateiname
 
Oops...

Ich meinte
Code:
Content-disposition: inline;
:wall:

tommie-lie 14. Okt 2004 17:56

Re: [PHP] Dateien mit Content-type & Dateiname
 
Probier's mal mit 'nem anderen Borwser ;-)
Laut passendem RFC ist dein Code richtig, Microsoft scheint aber wie immer andere Dokumentationen zur Entwicklung zu haben, als der Rest der Welt, ein Content-Disposition mit "attachment" wird also nicht korrekt interpretiert.
Abhilfe für alle Browser schafft ein browserabhängiges parsen:
Code:
header("Content-disposition: " . (!strpos($HTTP_SERVER_VARS["HTTP_USER_AGENT"]) ? "attachment;" : "") . " filename=$filename");
(hoffentlich war da jetzt kein Fehler drin, /me wird beim Trinitätskostrukt immer so :roteyes:)

Chewie 14. Okt 2004 18:41

Re: [PHP] Dateien mit Content-type & Dateiname
 
Hehe...
Mit dem IE hab ich es noch gar nicht ausprobiert, sondern mit dem Firefox. Also in diesem Fall KANN es nicht an Microsoft liegen. Ich werd das, was ihr geschrieben habt, aber trotzdem mal ausprobieren, danke.

tommie-lie 14. Okt 2004 18:44

Re: [PHP] Dateien mit Content-type & Dateiname
 
Zitat:

Zitat von Chewie
Mit dem IE hab ich es noch gar nicht ausprobiert, sondern mit dem Firefox.

Hmm, von dem kenne ich das Problem eigentlich nicht... :gruebel:

Chewie 14. Okt 2004 18:49

Re: [PHP] Dateien mit Content-type & Dateiname
 
Irgendwie versteh ich deinen Code nicht, tommie-lie. Du rufst strpos mit nur einem Parameter auf :?

Und das Verhalten ist im IE und im Firefox ähnlich: Im Firefox will er die Datei mit dem Firefox öffnen, was eine ANSI-Darstellung der Binärdaten nach sich zieht. Im IE öffnet er immerhin den Adobe Reader, dieser kann aber nicht das Dokument öffnen.

Mit dem inline passiert folgendes: Im IE lädt er zwar den Reader, zeigt ihn aber nicht an (eine komplett leere Seite) und im Firefox zeigt er wieder die Textdarstellung der Binärdaten an.

tommie-lie 14. Okt 2004 19:02

Re: [PHP] Dateien mit Content-type & Dateiname
 
Zitat:

Zitat von Chewie
Irgendwie versteh ich deinen Code nicht, tommie-lie. Du rufst strpos mit nur einem Parameter auf :?

Oh shit :wall:
Code:
!strpos($HTTP_SERVER_VARS["HTTP_USER_AGENT"], "MSIE")
Zitat:

Und das Verhalten ist im IE und im Firefox ähnlich: Im Firefox will er die Datei mit dem Firefox öffnen, was eine ANSI-Darstellung der Binärdaten nach sich zieht. Im IE öffnet er immerhin den Adobe Reader, dieser kann aber nicht das Dokument öffnen.

Mit dem inline passiert folgendes: Im IE lädt er zwar den Reader, zeigt ihn aber nicht an (eine komplett leere Seite) und im Firefox zeigt er wieder die Textdarstellung der Binärdaten an.
Komisches Verhalten bei den Parametern, oder ich übersehe hier ständig was. Folgender Code funktioniert nach eigener Erfahrung mit Firefox/Mozilla und IE (damals noch unter Win98, welcher IE war das? :gruebel:):
Code:
// get mime type of downloads
$mime = $mime_type[strrchr($filename, ".")];

header("Content-Type: {$mime}");
// This rather complex structure defines the inline/attachment character of the
// file: if it's an image or a text, show it directly (inline), otherwise send it as download
header("Content-Disposition: " . (!strpos($HTTP_SERVER_VARS["HTTP_USER_AGENT"],"MSIE 5.5") ?
    ((strstr($mime, "image") or strstr($mime, "text")) ? "inline;" : "attachment;") : "") .
     "filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
// send content length for progress bars
header("Content-Length: ".filesize($path . $filename));

// send file content to browser
readfile("/Internet/Apache2/htdocs/files/" . $path . $filename);
Bilder und Text wurden da noch im Browser angezeigt, weil ich es für sinnvoll hielt, PDFs müssten aber vollkommen korrekt heruntergeladen werden, mit passendem Dateinamen.
Leider kann ich das aber jetzt mit neuerem IE und aktuellem Firefox nicht mehr ausprobieren.

Chewie 14. Okt 2004 19:11

Re: [PHP] Dateien mit Content-type & Dateiname
 
:mrgreen:

Lustig. Ich hab in meinem ersten Post die beiden header-Aufrufe untereinander geschrieben, weil ich damit meinte, dass ich sowohl die eine als auch die andere Variante probiert hatte. Worauf ich nicht gekommen war, war, beide Header hintereinander zu senden. :wall:

Damit und mit der Unterscheidung zwischen IE und dem Rest klappt es. Danke, tommie-lie und Dax.

tommie-lie 14. Okt 2004 19:20

Re: [PHP] Dateien mit Content-type & Dateiname
 
Zitat:

Zitat von Chewie
Lustig. Ich hab in meinem ersten Post die beiden header-Aufrufe untereinander geschrieben, weil ich damit meinte, dass ich sowohl die eine als auch die andere Variante probiert hatte. Worauf ich nicht gekommen war, war, beide Header hintereinander zu senden. :wall:

Häh?

Naja, egal, es klappt...

himitsu 15. Okt 2004 00:53

Re: [PHP] Dateien mit Content-type & Dateiname
 
Also inline geht nicht, das ist ja für's einbinden (Bilder und so) und nicht für'n Download.

versuchs mal so ... bei mir gehts:
Code:
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=" . basename($Datei));
Content-Description war (glaub ich) für'n Netscape (oder so), der versteht Content-Disposition anscheinend nicht.


Du könntest auch noch versuchen die Datei in " einzuschießen:
Code:
header("Content-Description: File Transfer");
header('Content-Disposition: attachment; filename="' . basename($Datei) . '"');
Vorallem wenn Leer-/Sonderzeichen im Dateinamen sind kommen wohl auch einige Brauwser aus'm Takt.

tommie-lie 15. Okt 2004 10:41

Re: [PHP] Dateien mit Content-type & Dateiname
 
Na, Browser-Cache nicht geleert? :mrgreen:

Zitat:

Zitat von himitsu
Du könntest auch noch versuchen die Datei in " einzuschießen:

Laut RFC nicht (und man erzeugt damit RFC-unkonforme Header und ist keinen Deut besser als MS).

himitsu 15. Okt 2004 18:29

Re: [PHP] Dateien mit Content-type & Dateiname
 
Also bei mir ist kein " mit drin ... es geht auch so, allerdings machen es sehr viele so und es scheint zu funktionieren.

fiasko 15. Okt 2004 18:54

Re: [PHP] Dateien mit Content-type & Dateiname
 
Zitat:

Zitat von himitsu
Vorallem wenn Leer-/Sonderzeichen im Dateinamen sind kommen wohl auch einige Brauwser aus'm Takt.

Die haben da ja auch nix zu suchen - die müssen dann schon entsprechend escaped werden. Also die URL einfach einmal durch urlencode durchjagen.

himitsu 16. Okt 2004 08:43

Re: [PHP] Dateien mit Content-type & Dateiname
 
Keine Ahnung, hab's selber noch nicht ausprobiert - die 8.3-Namen machen jedenfalls nicht die geringsten Problemchen ^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz