파일 다운로드를 위해 Content-Type : application / octet-stream이 필요합니까?


414

HTTP 표준은 말합니다 :

이 헤더 [Content-Disposition : attachment]가 application / octet-stream content-type의 응답에 사용되는 경우 암시 된 제안은 사용자 에이전트가 응답을 표시하지 말고 직접 'save response as ..'를 입력해야한다는 것입니다. 대화 상자.

나는 그것을 다음과 같이 읽었다.

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

하지만 내가 생각했을 Content-Typeapplication/pdf, image/png

나는이해야 Content-Type: application/octet-stream내가 파일을 다운로드 브라우저를 원한다면?

답변:


959

아니.

content-type은 알고 있다면 알려진 것이어야합니다. application/octet-streamRFC 2046에서 "임의 이진 데이터"로 정의되며, 여기서 의도 된 목적이 디스크에 저장되고 그 시점부터 "웹비"외부에있는 개체에 적합하다는 명확한 중복이 있습니다. 또는 다른 방향에서 보거나; application / 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
이것은 훌륭한 답변이었으며, 그렇게 작동하면 정말 좋을 것입니다. 그러나 불행히도 모든 브라우저는 대부분 고장났습니다. 예를 들어, 콘텐츠 유형으로 "application / octet-stream"이 있더라도 "Content-Disposition : attachment"를 포함하지 않고 양식에서 응답 한 경우 Chrome에서 "파일 저장"창을 열지 않습니다. . 그런 다음 공격을 받고 있다는 메시지를 인쇄합니다. 파일을 저장할 수있는 방법은 없습니다. 파일을 저장하려는 경우에도 xdg-open을 구성해야합니다. 나는 이것에 아프다.
splitbyzero

1
@dividebyzero Chrome을 포함하여 내가 가진 문제는 아닙니다. 당신이하고있는 일에 특이한 것이 있습니까?
Jon Hanna

1
기본 enctype으로 파일을 업로드하는 것은 올바르지 않으며, 그 결과 파일 컨텐츠를 사용할 수있게 만들지 않고 일부 공격 탐지를 트리거했을 수 있습니다.
Jon Hanna

7
@Wilt 클라이언트가 저장하기를 원하는 경우, 헤더는 정보가 아니기 때문에 어떤 헤더가 전송 되든 상관 없습니다 (브라우저의 어떤 것에 든 "저장"또는 "다른 이름으로 링크 저장" attachment가능). "자신이 이것을 표시하지 않는 것이 가장 좋습니다"라고 생각하고 "가능한 inline경우 직접 표시하는 것이 가장 좋습니다". 어느 쪽이든, 대부분의 브라우저는 파일 이름 값을 파일의 제안 된 이름으로 사용하지만 사용자는 항상 그 값을 무시할 수 있습니다.
Jon Hanna

1
@Tresdin 감사합니다. 나는 그것이 더 인기가 있다고 생각하는 다른 사람들에 비해 너무 인기가 있다는 점에서 약간의 비 보완 적이지만 사람들의 문제에 대한 답을 얻었을 것이라고 생각합니다.
Jon Hanna
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.