ファイルのダウンロードにはContent-Type:application / octet-streamが必要ですか?


414

HTTP標準は言います:

このヘッダー[Content-Disposition:attachment]がapplication / octet-stream content-typeの応答で使用される場合、暗黙の提案は、ユーザーエージェントが応答を表示するのではなく、 `save response as .. 。 'ダイアログ。

私はそれを

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

しかし、私は思ってもみなかったContent-Typeだろうapplication/pdfimage/pngなど

Content-Type: application/octet-streamブラウザでファイルをダウンロードしたい場合はどうすればよいですか?

回答:


959

番号。

content-typeは、わかっている場合は、それがわかっているものである必要があります。application/octet-streamはRFC 2046で「任意のバイナリデータ」として定義されており、その唯一の意図された目的がディスクに保存されるエンティティに適切であり、その時点から「webby」の外側にあるという明確な重複があります。または、別の方向から見ます。application / octet-streamで安全にできる唯一のことは、それをファイルに保存し、誰かがそれが何のためにあるか知っていることを望んでいることです。

あなたはの使用組み合わせることができContent-Disposition、他のコンテンツタイプ、などとimage/png、さらにはtext/htmlあなたではなく、ディスプレイよりも節約したい示すために。以前は一部のブラウザがそれを無視するケースでしたtext/htmlこれはかなり前の時点であると思います(そして私はすぐに就寝するので、たくさんのテストを開始するつもりはありません現在のブラウザ;多分後で)。

RFC 2616は拡張トークンの可能性についても言及しており、最近のほとんどのブラウザーinlineは、可能であればエンティティーを表示したい(つまり、ブラウザーが表示方法を知っているタイプである場合、エンティティーを表示する必要があることを意味することを認識しています)。 。これはもちろんデフォルトの動作ですが、filenameブラウザーが使用するヘッダーの部分を含めることができることを意味します(おそらく、ファイル拡張子が問題のコンテンツタイプのローカルシステムノルムと一致するようにいくつかの調整を行った場合)。ユーザーが保存しようとした場合の提案として。

したがって:

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

「これは一体何なのかわからない。できれば、picture.pngという名前のファイルとして保存してください」という意味です。

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

「これはPNG画像です。ファイルとして保存してください。できれば、picture.pngという名前を付けてください。」

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

「これはPNG画像です。PNG画像の表示方法がわからない場合は表示してください。それ以外の場合、またはユーザーが保存することを選択した場合は、保存するファイルの名前をpicture.pngにすることをお勧めします。」

inline一部のブラウザは常にそれを使用しますが、他のブラウザは、ユーザーが「名前を付けてリンクを保存」を選択した場合に使用しますが、表示中に「保存」を選択した場合は使用しません(または、少なくともIEは以前はそうでしたが、数年前に変更された可能性があります)。


30
これは素晴らしい答えでした、そして、物事がそのように機能したならば、それは本当に素晴らしいでしょう。しかし、残念なことに、すべてのブラウザがほとんど壊れています。たとえば、コンテンツタイプが「application / octet-stream」の場合でも、「Content-Disposition:attachment」を含めても、これがフォームからの応答である場合、Google Chromeは「ファイルの保存」ウィンドウを開きません。 。そして、攻撃を受けている可能性があることを示すメッセージを表示します...ファイルを保存する方法はありません。ファイルを保存するだけの場合でも、xdg-openを構成する必要があります。私はこれにうんざりしています。
dividebyzero 2015

1
@dividebyzeroは、Chromeを含めて、私がこれまでに経験した問題ではありません。あなたがしていることに他に変わったことはありますか?
Jon Hanna、

1
デフォルトのenctypeでファイルをアップロードすると正しくないため、ファイルのコンテンツを利用できるようにするだけでなく、その結果、何らかの攻撃が検出された可能性があります。
Jon Hanna

7
@Wiltクライアントがそれを保存したい場合、ヘッダーは情報であり、ルールではないため、送信されるヘッダーは関係ありません(ブラウザーで何でも「保存」または「リンクを別名で保存」attachmentできます)。 「自分でこれを表示しないのが最善」と見なされ、「inline可能であればこれを自分で表示するのが最善」と見なされました。どちらの方法でも、ほとんどのブラウザーはファイル名の値をファイルの推奨名として使用しますが、ユーザーはいつでもそれを上書きできます。
Jon Hanna

1
@Tresdinありがとう。私はそれがあまりにも人気があるほど少し不満を感じており、他の人の一部と比較して私はより良いと思いますが、それは人々の問題に答えるスポットに達したに違いないと思います。
Jon Hanna
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.