Benötige ich Content-Type: application / octet-stream zum Herunterladen von Dateien?

414

Der HTTP-Standard sagt:

Wenn dieser Header [Content-Disposition: Anhang] in einer Antwort mit dem Inhaltstyp application / octet-stream verwendet wird, lautet der implizite Vorschlag, dass der Benutzeragent die Antwort nicht anzeigen, sondern direkt eine Antwort zum Speichern unter eingeben soll. . 'Dialog.

Ich habe das als gelesen

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

Aber ich hätte gedacht , dass Content-Typewäre application/pdf, image/pngusw.

Sollte ich haben, Content-Type: application/octet-streamwenn Browser die Datei herunterladen sollen?

Paul Draper
quelle

Antworten:

959

Nein.

Der Inhaltstyp sollte so sein, wie er bekannt ist, wenn Sie ihn kennen. application/octet-streamwird in RFC 2046 als "willkürliche Binärdaten" definiert, und es gibt hier eine eindeutige Überlappung, die für Entitäten geeignet ist, deren einziger Verwendungszweck darin besteht, auf der Festplatte gespeichert zu werden, und von diesem Punkt an außerhalb von "webby" zu sein. Oder um es aus einer anderen Richtung zu betrachten; Das einzige, was man mit application / octet-stream sicher machen kann, ist, es in einer Datei zu speichern und zu hoffen, dass jemand anderes weiß, wofür es ist.

Sie können die Verwendung von Content-Dispositionmit anderen Inhaltstypen kombinieren , z. B. image/pngoder sogar, text/htmlum anzuzeigen, dass Sie speichern und nicht anzeigen möchten. Früher war es so, dass einige Browser dies ignorierten, text/htmlaber ich denke, dass dies zu diesem Zeitpunkt schon lange her ist (und ich gehe bald ins Bett, damit ich nicht anfange, eine ganze Reihe von Tests durchzuführen Browser jetzt; vielleicht später).

RFC 2616 erwähnt auch die Möglichkeit von Erweiterungstoken, und heutzutage erkennen die meisten Browser, inlinedass die Entität nach Möglichkeit angezeigt werden soll (dh wenn es sich um einen Typ handelt, den der Browser anzeigen kann, hat er sonst keine Wahl). . Dies ist natürlich sowieso das Standardverhalten, aber es bedeutet, dass Sie den filenameTeil des Headers einschließen können , den die Browser verwenden (möglicherweise mit einigen Anpassungen, damit Dateierweiterungen den lokalen Systemnormen für den betreffenden Inhaltstyp entsprechen, möglicherweise nicht). als Vorschlag, wenn der Benutzer versucht zu speichern.

Daher:

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

Bedeutet "Ich weiß nicht, was zum Teufel das ist. Bitte speichern Sie es als Datei, vorzugsweise mit dem Namen picture.png".

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

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

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

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

Von den Browsern, die inlineeinige erkennen, wird es immer verwendet, während andere es verwenden, wenn der Benutzer "Link speichern unter" ausgewählt hat, aber nicht, wenn er beim Anzeigen "Speichern" ausgewählt hat (oder zumindest der IE war früher so) möglicherweise vor einigen Jahren geändert).

Jon Hanna
quelle
30
Dies war eine großartige Antwort, und es wäre wirklich schön, wenn die Dinge so funktionieren würden. Leider sind alle Browser kaputt. Zum Beispiel öffnet Google Chrome kein "Dateispeicher" -Fenster für Sie, wenn dies Ihre Antwort aus einem Formular ist, unabhängig davon, ob "Inhaltsdisposition: Anhang" enthalten ist, selbst wenn "Anwendung / Oktett-Stream" als Inhaltstyp verwendet wird . Und dann drucken sie eine Nachricht, dass Sie möglicherweise angegriffen werden ... Es gibt einfach keine Möglichkeit, eine Datei zu speichern. Sie müssen xdg-open konfigurieren, auch wenn Sie nur eine Datei speichern möchten. Ich hab kein Bock mehr.
Dividebyzero
1
@dividebyzero kein Problem, das ich jemals hatte, auch mit Chrome. Gibt es noch etwas Ungewöhnliches an dem, was du tust?
Jon Hanna
1
Das Hochladen einer Datei mit dem Standard-Enctype wäre falsch und möglicherweise löste das Ergebnis eine Angriffserkennung aus, anstatt nur zu fallen, um den Dateiinhalt verfügbar zu machen.
Jon Hanna
7
@Wilt , wenn der Kunde es retten will, dann spielt es keine Rolle , was Header gesendet werden (Sie können auf „Speichern“ oder „Link speichern unter“ auf irgendetwas in Ihrem Browser), wie die Header Informationen sind, keine Regeln , so attachmentkönnte gilt als "am besten, dies nicht selbst anzuzeigen" und inlineals "am besten, dies selbst anzuzeigen, wenn Sie können". In beiden Fällen verwenden die meisten Browser den Dateinamen als vorgeschlagenen Namen der Datei, aber Benutzer können diesen jederzeit überschreiben.
Jon Hanna
1
@Tresdin danke. Ich bin ein bisschen verblüfft darüber, dass es im Vergleich zu einigen meiner anderen so beliebt ist, dass ich es für besser halte, aber ich nehme an, es muss den Punkt erreicht haben, an dem die Probleme der Leute beantwortet wurden.
Jon Hanna