Tại sao Chrome đôi khi tải xuống bản PDF thay vì mở nó? [bản sao]


125

Khi tôi đi đến một số địa chỉ nhất định của tệp PDF, Chrome sẽ tải xuống tệp PDF thay vì mở tệp bằng trình xem PDF tích hợp. Các trang sau đó là màu trắng trống.

Không có vấn đề gì với cài đặt Chrome của tôi: Tôi thử địa chỉ của các tệp PDF khác và Chrome hoạt động như mong đợi (Tôi đã cài đặt để sử dụng trình xem PDF tích hợp của Chrome). Nhưng mỗi lần tôi thử cùng một địa chỉ có vấn đề, Chrome sẽ tải xuống bản PDF và sau đó hiển thị một trang trống.

Tôi đang sử dụng Windows 10 và Chrome Version 63.0.3239.84 (Official Build) (64-bit).

URL có vấn đề cụ thể của tôi lần này là ở đây (kết quả tìm kiếm của Google).

Câu trả lời:


159

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-Dispositiontiêu đề trong phản hồi. Cụ thể, nó có thể gửi inlinehoặ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.pdfthay 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/pdftệp - nhưng vì đó là attachmenttrì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-Dispositionlà 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ì 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-Typetiêu đề. Ví dụ, các loại nội tuyến phổ biến nhất là text/html, application/javascripttext/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-Typecủ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-Typemá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ó inlinebố 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/htmldưới dạng trang web, có thể mở application/jsontrong 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/pdfloạ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 Firefoxtùy chọn vẫn tồn tại:

Ảnh chụp màn hình của tùy chọn

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 chụp màn hình của các loại đã đăng ký

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.


Thỉnh thoảng nó cũng xảy ra khi máy chủ thiết lập Content-Type: application/octet-streamnhưng điều đó ít phổ biến hơn những ngày này.
Michael Hampton

2
Lý do tại sao các giá trị "nội tuyến" và "tệp đính kèm" được sử dụng là do Xử lý nội dung ban đầu được chỉ định cho email MIME, trong đó các giá trị đó phù hợp hơn rất nhiều :)
hobbs 18/12/17

@hobbs: Hầu như một nghiên cứu trường hợp về thuật ngữ cụ thể theo miền trong công nghệ tái sử dụng khi một thứ gì đó trừu tượng hơn sẽ làm ^ _ ^
Các cuộc đua nhẹ nhàng trong quỹ đạo

23

Tôi tìm thấy một lời giải thích. Theo câu trả lời tôi tìm thấy , có vẻ như Chrome sẽ tải xuống bản PDF nếu loại nội dung MIME được đặt không phải application/pdfmà là "loại MIME không chính xác hoặc chung chung" , application/octet-stream.

Hơn nữa , "Hầu hết các máy chủ web gửi tài nguyên loại không xác định bằng loại application/octet-streamMIME mặc định . Vì lý do bảo mật, hầu hết các trình duyệt không cho phép đặt hành động mặc định tùy chỉnh cho các tài nguyên đó, buộc người dùng phải lưu trữ vào đĩa để sử dụng."


3
Thật vậy - logic này ghi đè lên bố trí nội dung và do đó rất quan trọng để ghi nhớ.
Các cuộc đua nhẹ nhàng trong quỹ đạo

@LightnessRacesinOrbit Nó không ghi đè quá nhiều tính năng này vì nó cung cấp cho trình duyệt một loại mà nó không thể làm bất cứ điều gì với (chặn ngửi) ngoài việc lưu vào đĩa. Cấp, hiệu quả nhìn thấy là như nhau.
Bob

@Bob: Được rồi, đó là một cách giải thích công bằng
Các cuộc đua nhẹ nhàng trong quỹ đạo

20

Điều này là do tiêu đề HTTPContent-Disposition chỉ định rằng tệp là tệp đính kèm . Điều này hướng dẫn trình duyệt tải tập tin, thay vì mở trực tiếp.

Có một tiện ích bổ sung Chrome có thể ghi đè hành vi này. Hình ảnh sau đây là từ các công cụ dành cho nhà phát triển Firefox:

Yêu cầu HTTP như đã thấy trong các công cụ phát triển Firefox


Tôi có thể hỏi nếu có một tiện ích Firefox tương tự không?
dillyjones 17/12/17

3
@deefjones Bạn có thể. Vì vậy mà bạn không cần phải đặt câu hỏi liệu có một Firefox add-on, đây là một trong.
wizzwizz4

1
Plugin đó dường như không còn hoạt động nữa
Paul Slocum
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.