649 Stimmen

Muss ich Content-Type: application/octet-stream für den Dateidownload verwenden?

Der HTTP-Standard sagt:

Wenn dieser Header [Content-Disposition: Anlage] in einer Antwort mit dem Inhaltstyp application/octet-stream verwendet wird, wird damit impliziert, dass der User-Agent die Antwort nicht anzeigen, sondern direkt den Dialog zur Speicherung der Antwort aufrufen sollte.

Das verstehe ich so

Content-Type: application/octet-stream
Content-Disposition: attachment

ich hätte allerdings gedacht, dass Content-Type application/pdf, image/png, etc. sein würde.

Sollte ich Content-Type: application/octet-stream verwenden, wenn ich möchte, dass Browser die Datei herunterladen?

1428voto

Jon Hanna Punkte 106367

Nr.

Der Inhaltstyp sollte sein, was er zu sein bekannt ist, wenn Sie es wissen. application/octet-stream ist in RFC 2046 als "beliebige binäre Daten" definiert, und es gibt definitiv eine Überschneidung hier, dass es für Entitäten geeignet ist, deren alleiniger Zweck es ist, auf die Festplatte gespeichert zu werden und von diesem Zeitpunkt an außerhalb von allem "Webby" zu sein. Oder aus einer anderen Perspektive betrachtet; Das einzige, was man sicher mit application/octet-stream tun kann, ist es auf die Festplatte zu speichern und zu hoffen, dass jemand anderes weiß, wofür es ist.

Sie können die Verwendung von Content-Disposition mit anderen Inhaltstypen kombinieren, wie image/png oder sogar text/html, um anzuzeigen, dass Sie speichern möchten anstatt anzuzeigen. Früher war es so, dass einige Browser es bei text/html ignorieren würden, aber ich denke, das war vor langer Zeit (und ich gehe bald ins Bett, also werde ich jetzt nicht damit anfangen, eine ganze Reihe von Browsern zu testen; vielleicht später).

RFC 2616 erwähnt auch die Möglichkeit von Erweiterungstoken, und heutzutage erkennen die meisten Browser inline als Zeichen dafür, dass Sie möchten, dass die Entität wenn möglich angezeigt wird (das heißt, wenn es sich um einen Typ handelt, den der Browser weiß, wie man ihn anzeigt, sonst hat er keine Wahl in der Sache). Dies ist natürlich ohnehin das Standardverhalten, aber es bedeutet, dass Sie den Dateinamen-Teil des Headers einschließen können, den Browser verwenden wird (vielleicht mit einigen Anpassungen, damit Dateierweiterungen den lokalen Systemnormen für den betreffenden Inhaltstyp entsprechen, vielleicht auch nicht) als Vorschlag, wenn der Benutzer versucht, zu speichern.

Daher:

Content-Type: application/octet-stream
Content-Disposition: attachment; filename="bild.png"

Bedeutet "Ich weiß nicht, was zum Teufel das ist. Bitte speichere es als Datei, idealerweise mit dem Namen bild.png".

Content-Type: image/png
Content-Disposition: attachment; filename="bild.png"

Bedeutet "Dies ist ein PNG-Bild. Bitte speichern Sie es als Datei, idealerweise mit dem Namen bild.png".

Content-Type: image/png
Content-Disposition: inline; filename="bild.png"

Bedeutet "Dies ist ein PNG-Bild. Bitte zeigen Sie es an, es sei denn, Sie wissen nicht, wie man PNG-Bilder anzeigt. Andernfalls, oder wenn der Benutzer es speichern möchte, empfehlen wir den Namen bild.png für die Datei, in der Sie es speichern".

Von den Browsern, die inline erkennen, würden einige es immer verwenden, während andere es verwenden würden, wenn der Benutzer "Verknüpfung speichern unter" ausgewählt hat, aber nicht, wenn sie "Speichern" beim Anzeigen ausgewählt haben (oder zumindest war das bei IE früher so, es könnte vor einigen Jahren geändert haben).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X