Чи потрібен Content-Type: application / octet-stream для завантаження файлів?


414

Стандарт HTTP говорить:

Якщо цей заголовок [Content-Disposition: attachment] використовується у відповіді із типом вмісту application / octet-stream, мається на увазі пропозиція, що користувальницький агент не повинен відображати відповідь, а безпосередньо вводити "зберегти відповідь як .. . ".

Я читав це як

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

Але я б подумав , що Content-Typeбуло б application/pdf, image/pngі т.д.

Чи повинен я мати, Content-Type: application/octet-streamякщо хочу, щоб браузери завантажували файл?

Відповіді:


959

Ні.

Тип вмісту повинен бути таким, яким він є, якщо ви знаєте його. application/octet-streamвизначається як "довільні двійкові дані" в RFC 2046, і тут є певне перекриття, яке підходить для об'єктів, єдиною ціллю яких є збереження на диску, і з цього моменту знаходиться поза будь-чим "webby". Або подивитися на це з іншого напрямку; Єдине, що можна безпечно зробити із застосунком / 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
Це була чудова відповідь, і було б дійсно добре, якби справи працювали так. Але, на жаль, всі браузери в основному зламані. Наприклад, Google Chrome не відкриє для вас вікно "збереження файлу", якщо це ваша відповідь із форми, незалежно від включення "Вміст-диспозиція: вкладення", навіть якщо "тип вмісту-потоку" як тип вмісту . А потім вони надрукують повідомлення про те, що ти можеш зазнати нападу ... Просто я не дозволяє мені зберегти файл. Ви повинні налаштувати xdg-open, навіть якщо ви просто хочете зберегти файл. Мені це нудно.
ділбізеро

1
@dividebyzero - це не проблема, з якою я коли-небудь виникав, в тому числі з Chrome. Чи є ще щось незвичне в тому, що ви робите?
Джон Ханна

1
Завантаження файлу з ентетипом за замовчуванням було б неправильним і, можливо, результат цього викликав деяке виявлення атак, а не просто падіння, щоб зробити доступним вміст файлу.
Джон Ханна

7
@Wilt , якщо клієнт хоче , щоб зберегти його, то це не має значення , які заголовки відправляються (ви можете «зберегти» або «Зберегти як» на що - небудь у вашому браузері), так як заголовки інформації, а не правила , так attachmentможе бути вважається "найкращим не показувати це самостійно", а inlineяк "найкраще показувати це самостійно, якщо можете". Так чи інакше, більшість браузерів використовуватиме ім’я файлу як запропоноване ім'я файлу, але користувачі завжди можуть це перекрити.
Джон Ханна

1
@Tresdin дякую. Я трохи не здивований, що він такий популярний, що стосується деяких моїх інших, я вважаю б кращим, але, мабуть, він, мабуть, потрапив у місце відповіді на питання людей.
Джон Ханна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.