Czy potrzebuję Content-Type: application / octet-stream do pobierania plików?

414

Standard HTTP mówi:

Jeśli ten nagłówek [Content-Disposition: załącznik] zostanie użyty w odpowiedzi z typem treści application / octet-stream, sugerowana sugestia jest taka, że ​​agent użytkownika nie powinien wyświetlać odpowiedzi, ale bezpośrednio wpisać `zapisz odpowiedź jako .. . ”.

Przeczytałem to jako

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

Ale bym nie pomyślał, że Content-Typebyłoby application/pdf, image/pngitp

Czy powinienem, Content-Type: application/octet-streamjeśli chcę, aby przeglądarki pobierały ten plik?

Paul Draper
źródło

Odpowiedzi:

959

Nie.

Typ treści powinien być taki, jaki jest, o ile go znasz. application/octet-streamjest zdefiniowany jako „arbitralne dane binarne” w RFC 2046, i tutaj jest wyraźne nakładanie się na to, że jest odpowiedni dla podmiotów, których jedynym zamierzonym celem jest zapisanie na dysku, i od tego momentu znajduje się poza czymkolwiek „webby”. Lub spojrzeć na to z innej strony; jedyne, co można bezpiecznie zrobić z aplikacją / oktetem-strumieniem, to zapisać go do pliku i mieć nadzieję, że ktoś wie, do czego służy.

Możesz łączyć użycie Content-Dispositionz innymi typami treści, takimi jak, image/pnga nawet, text/htmlaby wskazać, że chcesz zapisać zamiast wyświetlać. Kiedyś niektóre przeglądarki ignorowały to w przypadku, text/htmlale myślę, że to było dawno temu w tym momencie (i wkrótce idę spać, więc nie zamierzam testować całej gamy przeglądarki w tej chwili; może później).

RFC 2616 wspomina również o możliwości tokenów rozszerzeń, a obecnie większość przeglądarek uznaje, inlineże oznacza, że ​​chcesz, aby jednostka była wyświetlana, jeśli to możliwe (to znaczy, jeśli jest to typ przeglądarki, który wyświetla, w przeciwnym razie nie ma wyboru) . Jest to oczywiście domyślne zachowanie, ale oznacza to, że możesz dołączyć filenameczęść nagłówka, której będą używać przeglądarki (być może z pewną modyfikacją, aby rozszerzenia plików były zgodne z lokalnymi normami systemowymi dla danego typu treści, a może nie) jako sugestia, jeśli użytkownik próbuje zapisać.

W związku z tym:

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

Oznacza „Nie wiem, co to do cholery jest. Proszę, zapisz je jako plik, najlepiej o nazwie picture.png”.

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

Oznacza „To jest obraz PNG. Proszę zapisać go jako plik, najlepiej o nazwie picture.png”.

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

Oznacza „To jest obraz PNG. Wyświetl go, chyba że nie wiesz, jak wyświetlać obrazy PNG. W przeciwnym razie lub jeśli użytkownik zdecyduje się go zapisać, zalecamy nazwę picture.png dla pliku, który zapiszesz jako”.

Spośród tych przeglądarek, które rozpoznają, inlineniektóre zawsze by go używały, podczas gdy inne użyłyby go, gdyby użytkownik wybrał „zapisz link jako”, ale nie, jeśli wybrałby „zapisz” podczas przeglądania (lub przynajmniej IE tak było, mogło się zmienić kilka lat temu).

Jon Hanna
źródło
30
To była świetna odpowiedź i byłoby naprawdę miło, gdyby coś tak działało. Ale niestety wszystkie przeglądarki są w większości zepsute. Na przykład Google Chrome nie otworzy dla ciebie okna „zapisywania pliku”, jeśli jest to twoja odpowiedź z formularza, niezależnie od włączenia „Content-Disposition: załącznik”, nawet z „application / octet-stream” jako typem zawartości . A potem drukują wiadomość, że możesz zostać zaatakowany ... Po prostu nie ma sposobu, aby pozwolić mi zapisać plik. Musisz skonfigurować xdg-open, nawet jeśli chcesz tylko zapisać plik. Mam dość tego.
dividebyzero
1
@dividebyzero to nie problem, jaki kiedykolwiek miałem, w tym z Chrome. Czy jest coś jeszcze niezwykłego w tym, co robisz?
Jon Hanna
1
Przesłanie pliku z domyślnym typem byłoby niepoprawne i być może wynik tego spowodował pewne wykrycie ataku, a nie tylko upadek na udostępnienie zawartości pliku.
Jon Hanna
7
@ Wilt, jeśli klient chce go zapisać, to nie ma znaczenia, jakie nagłówki są wysyłane (możesz „zapisać” lub „zapisać link jako” w dowolnej przeglądarce), ponieważ nagłówki to informacje, a nie reguły, więc attachmentmoże to być uważane za „najlepiej tego nie pokazywać”, a inlinejako „najlepiej to pokazywać, jeśli potrafisz”. Tak czy inaczej, większość przeglądarek użyje wartości nazwy pliku jako sugerowanej nazwy pliku, ale użytkownicy zawsze mogą to zmienić.
Jon Hanna,
1
@Tresdin dzięki. Nie jestem przekonany, że jest tak popularny, że w porównaniu z niektórymi z moich innych uważałbym go za lepszy, ale przypuszczam, że trafił w sedno odpowiadania na pytania ludzi.
Jon Hanna,