Tôi có cần Content-Type: application / octet-stream để tải tập tin không?


414

Các tiêu chuẩn HTTP nói:

Nếu tiêu đề này [Xử lý nội dung: tệp đính kèm] được sử dụng trong phản hồi với loại nội dung của ứng dụng / octet-stream, thì gợi ý ngụ ý là tác nhân người dùng không nên hiển thị phản hồi, nhưng trực tiếp nhập phản hồi `lưu dưới dạng .. Hộp thoại. '

Tôi đọc nó như là

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

Nhưng tôi sẽ phải suy nghĩ rằng Content-Typesẽ là application/pdf, image/pngvv

Tôi có nên có Content-Type: application/octet-streamnếu tôi muốn trình duyệt tải tập tin không?

Câu trả lời:


959

Không.

Kiểu nội dung nên là bất cứ thứ gì nó được biết đến, nếu bạn biết nó. application/octet-streamđược định nghĩa là "dữ liệu nhị phân tùy ý" trong RFC 2046 và có sự trùng lặp nhất định ở đây phù hợp với các thực thể có mục đích duy nhất là được lưu vào đĩa và từ thời điểm đó nằm ngoài bất kỳ "webby" nào. Hoặc để nhìn nó từ một hướng khác; điều duy nhất người ta có thể làm một cách an toàn với application / octet-stream là lưu nó vào tệp và hy vọng người khác biết nó dùng để làm gì.

Bạn có thể kết hợp việc sử dụng Content-Dispositionvới các loại nội dung khác, chẳng hạn như image/pnghoặc thậm chí text/htmlđể cho biết bạn muốn lưu thay vì hiển thị. Nó đã từng là trường hợp mà một số trình duyệt sẽ bỏ qua nó trong trường hợp này text/htmlnhưng tôi nghĩ rằng điều này đã xảy ra cách đây rất lâu vào thời điểm này (và tôi sẽ đi ngủ sớm vì vậy tôi sẽ không bắt đầu thử nghiệm cả đống trình duyệt ngay bây giờ, có thể sau này).

RFC 2616 cũng đề cập đến khả năng mã thông báo mở rộng và ngày nay hầu hết các trình duyệt nhận ra inlinecó nghĩa là bạn muốn thực thể hiển thị nếu có thể (nghĩa là, nếu đó là loại trình duyệt biết cách hiển thị, nếu không thì không có vấn đề gì trong vấn đề này) . Tất nhiên đây là hành vi mặc định, nhưng điều đó có nghĩa là bạn có thể bao gồm filenamemột phần của tiêu đề, trình duyệt sẽ sử dụng (có thể với một số điều chỉnh để tiện ích mở rộng tệp phù hợp với định mức hệ thống cục bộ cho loại nội dung trong câu hỏi, có lẽ không) như đề xuất nếu người dùng cố gắng lưu.

Vì thế:

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

Có nghĩa là "Tôi không biết đây là cái quái gì. Vui lòng lưu nó dưới dạng tệp, tốt nhất là có tên là image.png".

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

Có nghĩa là "Đây là một hình ảnh PNG. Vui lòng lưu nó dưới dạng một tệp, tốt nhất là có tên là image.png".

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

Có nghĩa là "Đây là hình ảnh PNG. Vui lòng hiển thị nó trừ khi bạn không biết cách hiển thị hình ảnh PNG. Nếu không, hoặc nếu người dùng chọn lưu nó, chúng tôi khuyên bạn nên đặt tên image.png cho tệp bạn lưu dưới dạng".

Trong số các trình duyệt nhận ra inlinemột số sẽ luôn sử dụng nó, trong khi những trình duyệt khác sẽ sử dụng nó nếu người dùng đã chọn "lưu liên kết là" nhưng không phải nếu họ đã chọn "lưu" trong khi xem (hoặc ít nhất là IE đã từng như vậy, thì nó có thể đã thay đổi vài năm trước).


30
Đây là một câu trả lời tuyệt vời, và nó sẽ thực sự tốt nếu mọi thứ hoạt động như vậy. Nhưng thật không may, tất cả các trình duyệt hầu hết bị hỏng. Chẳng hạn, Google Chrome sẽ không mở cửa sổ "lưu tệp" cho bạn nếu đây là phản hồi của bạn từ một biểu mẫu, bất kể bao gồm "Xử lý nội dung: tệp đính kèm", ngay cả với "application / octet-stream" dưới dạng loại nội dung . Và sau đó họ in một thông báo nói rằng bạn có thể đang bị tấn công ... Không có cách nào để tôi lưu tệp. Bạn phải định cấu hình xdg-open ngay cả khi bạn chỉ muốn lưu tệp. Tôi phát ốm vì điều này.
splititherzero

1
@dividitherzero không phải là vấn đề tôi từng gặp phải, kể cả với Chrome. Có điều gì khác thường trong những gì bạn đang làm không?
Jon Hanna

1
Tải lên một tệp với mã hóa mặc định sẽ không chính xác và có lẽ kết quả của việc đó đã kích hoạt một số phát hiện tấn công, thay vì chỉ rơi để làm cho nội dung tệp có sẵn.
Jon Hanna

7
@Wilt nếu khách hàng muốn lưu nó, sau đó nó không có vấn đề gì header được gửi (bạn có thể "tiết kiệm" hoặc "Save Link As" trên bất cứ điều gì trong trình duyệt của bạn), như các tiêu đề là thông tin, không cai trị rất attachmentcó thể là coi "tốt nhất không nên tự hiển thị cái này" trong khi inline"tốt nhất là tự hiển thị cái này nếu bạn có thể". Dù bằng cách nào, hầu hết các trình duyệt sẽ sử dụng giá trị tên tệp làm tên được đề xuất của tệp, nhưng người dùng luôn có thể ghi đè lên đó.
Jon Hanna

1
@Tresdin cảm ơn. Tôi hơi ngạc nhiên rằng nó rất phổ biến, so với một số người khác mà tôi cho là tốt hơn, nhưng tôi cho rằng nó phải đạt được mục đích trả lời các vấn đề của mọi người.
Jon Hanna
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.