104

znalazłem następujący kod asp.net być bardzo przydatna przy obsłudze plików z bazy danych:Zastosowań Content-Disposition w nagłówku odpowiedzi HTTP

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

To pozwala użytkownikowi zapisać plik na swoim komputerze a następnie zdecydować, jak z niego korzystać, zamiast przeglądarki próbującej użyć tego pliku.

Co jeszcze można zrobić z nagłówkiem odpowiedzi na treść?

+1

Jest jakiś ładny dokumentacja tego od Microsoft: http://support.microsoft.com/kb/260519 –

+22

Zwróć uwagę, że Twój przykładowy kod zostanie złamany, jeśli nazwa pliku zawiera znaki białe lub spoza zestawu ASCII. Aby uzyskać więcej informacji, zobacz dokument RFC 6266. –

+0

@JulianReschke, a co ze znakami ASCII, które są uważane za niedrukowalne? ('0' do' 0x1F') – Pacerier

Odpowiedz

75

Władza w nagłówku Content-Disposition jest RFC 1806 i RFC 2183. Ludzie również opracować Ważne jest, aby pamiętać, że nagłówek Content-dyspozycja nie jest częścią standardu HTTP 1.1.

HTTP 1,1 Standard (RFC 2616) wskazuje również efektów ubocznych bezpieczeństwa o zawartości Disposition:

15,5 Content-Disposition problemy

RFC 1806 [35], z których często realizowane Zawartość -Disposition
(patrz sekcja 19.5.1) nagłówek w HTTP jest pochodzi, ma wiele bardzo poważnych względów bezpieczeństwa związanych z
. Content-Dyspozycja nie jest częścią
standardu HTTP, ale ponieważ jest powszechnie wdrożone, jesteśmy
dokumentowania jej wykorzystania i zagrożenia dla implementors. Zobacz dokument RFC 2183 [49]
(który aktualizuje dokument RFC 1806) w celu uzyskania szczegółowych informacji.

Należy pamiętać, że RFC 6266 zastępuje specyfikacje RFC wymienione poniżej. Section 7 przedstawia niektóre z powiązanych problemów bezpieczeństwa.

+30

Obecnie organem jest RFC 6266. –

+17

RFC 6266 można znaleźć tutaj: http://tools.ietf.org/html/rfc6266. – rstackhouse

+0

@JulianReschke, Jak działa "zastępuje" i "aktualizacje"? Czy nowsze wersje, takie jak RFC 7230, czynią także RFC 6266 przestarzałym? – Pacerier

21

Wygląda na to, że nagłówek Content-Disposition został pierwotnie stworzony dla poczty e-mail, a nie dla sieci. (Link to relevant RFC.)

Zgaduję, że przeglądarek internetowych może odpowiedzieć na

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

podczas zapisywania, ale nie jestem pewien.

+3

Działa tylko FF; zobacz http://greenbytes.de/tech/tc2231/#inlwithasciifilename –

+2

Próbowałem tylko z najnowszym IE i Chrome i teraz działa. – Traubenfuchs

2

Ten nagłówek jest zdefiniowany w RFC 2183, więc byłoby to najlepsze miejsce do rozpoczęcia czytania.

Dopuszczalne wartości to zarejestrowane w Internet Assigned Numbers Authority (IANA); ich registry of values powinny być postrzegane jako ostateczne źródło.

4

Dla użytkowników ASP.NET powoduje.NET zapewnia klasę do tworzenia treści Disposition: System.Net.Mime.ContentDisposition

Podstawowe użycie:

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

Uwaga: ta klasa nie jest zgodna z [RFC 6266] (http://tools.ietf.org/html/rfc6266#section-4.3). Kodowanie UTF-8 base64 w parametrze 'nazwa_pliku 'zamiast parametru' nazwa_pliku '' z kodowaniem [RFC 5987] (http://tools.ietf.org/html/rfc5987). Nie ma sposobu na wyprowadzenie lub użycie narzędzia fx utils w celu naprawienia tego, prawie wszystko jest nieprzeznaczalne lub wewnętrzne ... .Net fx ma jeszcze długą drogę do nauki otwartości i rozszerzalności. W MVC 5.2, klasa 'FileResult' robi trochę lepsze dla' filename', ale nie obsługuje innych parametrów jako 'inline', a większość jego implementacji jest również wewnętrzna ... –

Powiązane problemy