Мне нужен Content-Type: application/octet-stream для загрузки файла?

HTTP-стандарт говорит:

Если этот заголовок [Content-Disposition: attachment] используется в ответе с типом содержимого приложения/октета-потока, подразумеваемый что пользовательский агент не должен отображать ответ, но непосредственно введите диалоговое окно "save response as...".

Я читал, что как

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

Но я бы подумал, что Content-Type будет application/pdf, image/png и т.д.

Должен ли я иметь Content-Type: application/octet-stream, если я хочу, чтобы браузеры загружали файл?

Ответ 1

Нет.

Тип контента должен быть тем, кем он известен, если вы его знаете. application/octet-stream определяется как "произвольные двоичные данные" в RFC 2046, и здесь существует определенное перекрытие, которое подходит для объектов, единственная цель которых должна быть сохранена на диске, и с этой точки не должно быть ничего "webby", Или смотреть на него с другого направления; единственное, что можно безопасно делать с приложением/октетом-потоком, - это сохранить его в файл и надеяться, что кто-то еще знает, для чего он.

Вы можете комбинировать использование 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 использовали чтобы быть таким, возможно, это изменилось несколько лет назад).