104

я нашел следующий код asp.net быть очень полезным при обслуживании файлов из базы данных:Использование контент-диспозиции в заголовке ответа HTTP

Response.AppendHeader("content-disposition", "attachment; filename=" + fileName); 

Это позволяет пользователю сохранить файл на свой компьютер а затем решить, как его использовать, вместо браузера, пытающегося использовать этот файл.

Что еще можно сделать с заголовком ответа на содержание?

+1

Там какая-то хорошая документация этого от Microsoft: http://support.microsoft.com/kb/260519 –

+22

Обратите внимание, что ваш образец кода будет разорваться, если имя файла содержит пробельные символы или символы, отличные от ASCII. См. RFC 6266 для получения дополнительной информации. –

+0

@JulianReschke, Что относительно символов ASCII, которые считаются непечатаемыми? ('0' до' 0x1F') – Pacerier

ответ

75

Орган по заголовку контента диспозиции RFC 1806 и RFC 2183. Люди также разработали Важно отметить, что заголовок контента диспозиция не является частью стандарта HTTP 1.1.

HTTP-1.1 Стандартный (RFC 2616) также упоминает возможные побочные безопасности эффекты контента расположения:

15.5 Content-Disposition вопросам

RFC 1806 [35], из которой часто реализован Content -Disposition
(см. Раздел 19.5.1) заголовок в HTTP - это производный, имеет ряд очень важных соображений безопасности в отношении
. Content-Disposition не является частью
стандартной HTTP, но так как это широко применяется, мы
документирование его использования и риски для реализаторов. См. RFC 2183 [49]
(который обновляет RFC 1806).

Отметьте, что RFC 6266 заменяет RFC, указанные ниже. Section 7 описывает некоторые связанные с этим проблемы безопасности.

+30

В настоящее время полномочным органом является RFC 6266. –

+17

RFC 6266 можно найти здесь: http://tools.ietf.org/html/rfc6266. – rstackhouse

+0

@JulianReschke, Как «замещает» и «обновляет» работу? Могут ли новые версии, такие как RFC 7230, сделать RFC 6266 устаревшими? – Pacerier

21

Ну, похоже, что заголовок Content-Disposition изначально был создан для электронной почты, а не из Интернета. (Link to relevant RFC.)

Я предполагаю, что веб-браузеры могут реагировать на

Response.AppendHeader("content-disposition", "inline; filename=" + fileName); 

при сохранении, но я не уверен.

+3

Только FF делает; см. http://greenbytes.de/tech/tc2231/#inlwithasciifilename –

+2

Я только что пробовал с последними IE и Chrome, и теперь он работает. – Traubenfuchs

2

Этот заголовок определен в RFC 2183, так что это будет лучшее место для начала чтения.

Допустимые значения - это зарегистрированные в уполномоченном ведомстве Интернета (IANA); их registry of values следует рассматривать как окончательный источник.

6

Обратитесь к RFC 6266 (использование Content-Disposition поле заголовка в протоколе передачи гипертекста (HTTP)) http://tools.ietf.org/html/rfc6266

4

Для пользователей ASP.NET,.NET Framework предоставляет класс для создания контента распоряжения заголовок: System.Net.Mime.ContentDisposition

Базовое использование:

var cd = new System.Net.Mime.ContentDisposition(); 
cd.FileName = "myFile.txt"; 
cd.ModificationDate = DateTime.UtcNow; 
cd.Size = 100; 
Response.AppendHeader("content-disposition", cd.ToString()); 
+1

Опасайтесь, этот класс не соответствует [RFC 6266] (http://tools.ietf.org/html/rfc6266#section-4.3). Он кодирует UTF-8 base64 в параметре «filename» вместо использования параметра 'filename *' с кодировкой [RFC 5987] (http://tools.ietf.org/html/rfc5987). Невозможно получить или использовать fx utils, чтобы исправить это, почти все неперекрываемо или внутренне ... .Net fx еще долго изучает открытость и расширяемость. В MVC 5.2 класс 'FileResult' немного лучше подходит для' filename', но не обрабатывает другие параметры как 'inline', и большая часть его реализации также является внутренней ... –