Về cơ bản, điều này xảy ra bởi vì trang web yêu cầu trình duyệt làm điều đó. Đôi khi, đó là vì nhà phát triển trang web quyết định họ muốn hành vi này, ví dụ như phổ biến trên các trang web chia sẻ tệp. Đôi khi, đó là vì đó là một tùy chọn mặc định cho bất kỳ phần mềm nào họ đang sử dụng (ví dụ: diễn đàn hoặc phần mềm viết blog). Đôi khi, vì nhà phát triển trang web không biết họ đang làm gì.
Content-Disposition
Điều đó thường là do trang web gửi Content-Disposition
tiêu đề trong phản hồi. Cụ thể, nó có thể gửi inline
hoặc attachment
.
inline
là mặc định nếu không được chỉ định khác và có nghĩa là trình duyệt sẽ mở tệp trong cửa sổ trình duyệt nếu có thể.
attachment
có nghĩa là luôn tải tệp xuống, không bao giờ thử mở tệp trong trình duyệt.
Nếu bạn mở các công cụ dành cho nhà phát triển của trình duyệt, bạn sẽ thấy liên kết cụ thể đó sẽ gửi các tiêu đề phản hồi sau:
Content-Disposition: attachment; filename="Schubert-Sonata-21-B-flat.pdf"
Content-Type: application/pdf
Điều này báo cho trình duyệt luôn tải xuống ( attachment
) tệp và đặt cho nó tên tệp mặc định Schubert-Sonata-21-B-flat.pdf
thay vì suy ra từ URL. Ngoài ra, nó nói với trình duyệt (chính xác) rằng đó là một application/pdf
tệp - nhưng vì đó là attachment
trình duyệt sẽ vẫn mặc định tải xuống.
Chi tiết xử lý nội tuyến
Khi a Content-Disposition
là nội tuyến (hoặc không xác định), trình duyệt sẽ cố gắng mở tệp trong trình xem được nhúng mặc định. Điều này chỉ hoạt động khi trình duyệt biết loại tệp đó là gì và trình duyệt biết cách mở loại đó.
Phát hiện loại
Loại tệp có thể được chỉ định bởi máy chủ với một Content-Type
tiêu đề. Ví dụ, các loại nội tuyến phổ biến nhất là text/html
, application/javascript
và text/css
, tạo thành ba phần chính của một trang web hiện đại. Bạn cũng có thể có nhiều loại bí truyền như application/pdf
.
Một khả năng khác là máy chủ đã chỉ định Content-Type
của application/octet-stream
. Đây là loại chung chung nhất và nó cho trình duyệt biết rằng tệp chỉ là dữ liệu tùy ý - tại thời điểm đó, điều duy nhất trình duyệt có thể làm là tải xuống (về lý thuyết - chúng ta sẽ đến đó).
Khi Content-Type
máy chủ không được chỉ định (và đôi khi ngay cả khi đó), trình duyệt có thể thực hiện những gì được gọi là đánh hơi để cố gắng đoán loại bằng cách đọc tệp và tìm mẫu.
Xử lý loại
Khi nhận được một tệp có inline
bố trí hoặc không xác định, trình duyệt cần cố gắng mở tệp trong trình duyệt nếu có thể. Để làm điều này, nó nhìn vào loại tệp và nếu nó nhận ra loại nó sẽ cố gắng mở nó. Hầu hết các trình duyệt sẽ mở bất kỳ text/
loại nào trong trình xem văn bản đơn giản, sẽ cố gắng hiển thị text/html
dưới dạng trang web, có thể mở application/json
trong trình xem được tô sáng theo cú pháp đặc biệt , v.v.
Các loại application/octet-stream
đã được xử lý đặc biệt. Vì nó được coi là loại chung nhất, biểu thị một luồng byte tùy ý, nên không có bất kỳ trình xử lý nào có thể áp dụng cho tất cả các tệp thuộc "loại" này. Ví dụ: trong Firefox, điều này biểu hiện là không có khả năng đặt trình xử lý mặc định cho application/octet-stream
.
Một số trang web cũng đã sử dụng các loại không chuẩn. Tôi đã thấy application/force-download
được sử dụng - kết thúc dưới dạng tải xuống vì trình duyệt không nhận ra hoặc không biết phải làm gì với loại này, nhưng không thích xử lý đặc biệt application/octet-stream
.
Một chút của một bài học lịch sử
Để xem cách xử lý các tệp PDF, chúng ta có thể đi sâu một chút vào lịch sử web. Hãy xem, trước đây, các trình duyệt không biết PDF là gì. Vì vậy, họ không thể mở nó. Nhưng chúng ta đã thấy các tệp PDF được mở trong các trình duyệt từ lâu trước khi trình xem PDF tích hợp là một thứ, vậy nó hoạt động như thế nào?
Nó được sử dụng để có thể mở rộng chức năng trình duyệt với nhiều quyền kiểm soát hơn những gì bạn có thể làm với các tiện ích mở rộng / addons giới hạn ngày nay. Chúng thường được gọi là plugin . Trong Internet Explorer, chúng là các điều khiển ActiveX; trong Mozilla Firefox và sau đó là Google Chrome, chúng là các plugin NPAPI. Các plugin này có khả năng thực hiện mọi thứ mà bất kỳ chương trình nào khác có thể và cũng có thể tự đăng ký làm trình xử lý cho một loại tệp cụ thể mà trình duyệt không thể nhận ra. (Ngẫu nhiên, điều này sau đó được phát hiện là một rủi ro bảo mật rất lớn và sự hỗ trợ cho các plugin mạnh mẽ này đã dần bị loại bỏ ...)
Trong thời của các plugin, bạn sẽ đi và cài đặt Adobe Acrobat Reader, sau đó sẽ cài đặt một plugin ActiveX hoặc NPAPI sẽ đăng ký application/pdf
loại MIME và báo cho trình duyệt mở các loại đó bằng cách sử dụng plugin.
Tất nhiên, sau một số vấn đề về bảo mật và hiệu suất do các plugin này gây ra, các nhà cung cấp trình duyệt lớn đã quyết định kết hợp trình xem PDF của riêng họ trong khi loại bỏ hỗ trợ cho hầu hết các plugin. Người duy nhất chúng ta vẫn thấy là Adobe Shockwave Flash, xử lý application/x-shockwave-flash
.
Thực tế vẫn còn một số điều khiển còn sót lại cho việc này, ví dụ như trong Firefox, Preview in Firefox
tùy chọn vẫn tồn tại:
Trước đây, điều này sẽ cho phép lựa chọn giữa nhiều plugin đã đăng ký loại đó. Ví dụ: danh sách các loại đã đăng ký cho Flash:
Những ngày đó cũng là trước khi có rất nhiều hỗ trợ truyền thông đi kèm với HTML5. Đó không chỉ là PDF - trình duyệt của bạn sẽ không biết cách xử lý video MP4 hoặc video H.264, không biết cách phát tệp MP3, v.v., v.v. Bạn sẽ thấy các plugin được cung cấp bởi các trình phát phương tiện như VLC hoặc thậm chí Windows Media Player hoặc các trang web sẽ nhúng trình phát phương tiện được tích hợp trong Flash.
Content-Type: application/octet-stream
nhưng điều đó ít phổ biến hơn những ngày này.