Tài nguyên được hiểu là Tài liệu nhưng được chuyển bằng ứng dụng / zip loại MIME


199

Với Chrome 12.0.742.112, nếu tôi chuyển hướng với các tiêu đề sau:

HTTP/1.1 302 Found 
Location: http://0.0.0.0:3000/files/download.zip
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
X-Ua-Compatible: IE=Edge
X-Runtime: 0.157964
Content-Length: 0
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)
Date: Tue, 05 Jul 2011 18:42:25 GMT
Connection: Keep-Alive

Mà nếu theo sau trả về tiêu đề sau:

HTTP/1.1 200 OK 
Last-Modified: Tue, 05 Jul 2011 18:18:30 GMT
Content-Type: application/zip
Content-Length: 150014
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)
Date: Tue, 05 Jul 2011 18:44:47 GMT
Connection: Keep-Alive

Chrome sẽ không chuyển hướng, cũng không thay đổi trang trước đó, nó sẽ chỉ báo cáo cảnh báo sau trong bảng điều khiển:

Tài nguyên được hiểu là Tài liệu nhưng được chuyển bằng ứng dụng / zip loại MIME.

Quá trình hoạt động chính xác trong Firefox và cũng hoạt động tốt trong Chrome nếu tôi mở một tab mới và truy cập trực tiếp vào http://0.0.0.0:3000/files/download.zip. Tôi đang làm gì đó sai hay đây là lỗi / lỗi của Chrome?


Câu trả lời:


168

Bạn có thể chỉ định thuộc tính tải xuống HTML5 trong thẻ <a> của mình.

<a href="http://example.com/archive.zip" download>Export</a>

https://developer.mozilla.org/en-US/docs/Web/HTML/Euity/a#attr-doad


3
Thuộc tính "tải xuống" không hỗ trợ trong tức là hoặc một số trình duyệt khác. nếu bạn có một lựa chọn khác, xin hãy giúp tôi
Đổi mới Khunt 17/2/2015

3
Điều đó sửa Chrome, nhưng phá vỡ các trình duyệt khác. Điện thoại Android của tôi sẽ không tải xuống từ loại liên kết đó.
Betty

38
thở dài. 'FIX' NÀY KHÔNG LÀM VIỆC CHO NGƯỜI DUY NHẤT NHẤT - chỉ Chrome. Và đó là năm 2016, vì vậy đừng mong đợi điều đó sớm.
a20

2
Không tạo ra sự khác biệt trong Chrome 2019
Michael Rogers

17
@all Đó là năm 2035 (Tôi đến từ tương lai) và không có máy tính để hỗ trợ việc này.
Ali Farhoudi

34

Trong tiêu đề yêu cầu của bạn, bạn đã gửi Content-Type: text/htmlcó nghĩa là bạn muốn diễn giải phản hồi dưới dạng HTML. Bây giờ nếu ngay cả máy chủ gửi cho bạn tệp PDF, trình duyệt của bạn sẽ cố gắng hiểu nó dưới dạng HTML. Đó chính là vấn đề. Tôi đang tìm kiếm để xem lý do có thể là gì. :)


Tôi đã cố gắng gửi nó nhưng Content-Type: application/zipkhông có kết quả, nó vẫn cố xử lý nó như một "Tài liệu". Có lẽ cũng đáng để chỉ ra rằng URL zip là động trong ứng dụng của tôi, vì vậy nó không liên quan gì đến bộ nhớ đệm.
Ashley Williams

1
Cảm ơn! Nó có thể là một cái gì đó để làm với Chrome gửi Accepttiêu đề yêu cầu text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, có lẽ? Tôi thực sự bối rối ở đây, tôi thực sự là vậy!
Ashley Williams

5
Không, trong text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8đó có một phần nói rằng Chrome chấp nhận hầu hết mọi thứ ( */*).
Saeed Neamati

3
Bạn đang nói về cái gì vậy? Không có tiêu đề yêu cầu trong câu hỏi. Cả hai đều là tiêu đề phản hồi.
doubleDown

1
Và tôi đang ngồi đây tự hỏi tại sao điều này nên là một câu trả lời nhưng không phải là một bình luận?
bảng điều khiển

24

Tôi đã gặp sự cố này khi cung cấp tệp PDF (ứng dụng loại MIME / pdf) và giải quyết nó bằng cách đặt tiêu đề Xử lý nội dung, ví dụ:

Content-Disposition: attachment; filename=foo.pdf

Mong rằng sẽ giúp.


11
Nhưng viết cái này ở đâu?
hud

4
@coder Bạn thêm các tiêu đề như thế này từ máy chủ web của bạn. Không chắc chắn những gì bạn đang sử dụng cho điều đó, vì vậy thật khó để cung cấp thêm thông tin. Ngôn ngữ hoặc khung nào bạn đang sử dụng cho máy chủ của mình?
Evan

7
Có điều này trong các tiêu đề của chúng tôi nhưng Chrome vẫn đưa ra cảnh báo
Adam Reis

Không có bất cứ điều gì trên chrome Phiên bản 76.0.3809.132 (Bản dựng chính thức) (64-bit) tôi đã có các tiêu đề được đính kèm
Muhammad Omer Aslam

22

Tôi đã sửa lỗi này bằng cách mở một tab mới.

Tại sao nó không hoạt động Tôi không hoàn toàn chắc chắn, nhưng nó có thể có liên quan đến cách Chrome xử lý nhiều lượt tải xuống trên một trang, có lẽ nó nghĩ rằng chúng là spam và chỉ cần bỏ qua chúng.


6
Bạn có ý nghĩa gì khi bạn "mở một tab mới" ??? Bạn đã tự mở một cửa sổ trình duyệt mới và dán URL tải xuống ở đó?
Tony R

2
Đúng chính xác. Tôi giả sử đó là một lỗi trong trạng thái ứng dụng của tab cụ thể.
Ashley Williams

52
Tôi sẽ không mong muốn người dùng mở một tab mới ... Và tôi cũng không tìm thấy việc mở một tệp để tải xuống một tệp thanh lịch.
Yassir Ennazk

24
@Joram et. al. - mở tab để tải xuống (sử dụng mục tiêu '_blank') - không giải quyết được vấn đề, nó chỉ chuyển thông báo cảnh báo bảng điều khiển "Tài nguyên được mô tả dưới dạng Tài liệu" sang một tab mới. Quét dưới tấm thảm không phải là giải pháp.
colm.anseo

1
Điều này rõ ràng không giải quyết được câu trả lời ban đầu. Nghiêm túc ... Tôi sẽ đặt gì vào tài liệu người dùng "sao chép url, mở tab mới, dán url, ..."? Kinh doanh xuống.
Bị mắc kẹt

22

Tôi không thể tìm thấy bất cứ nơi nào chỉ là một lời giải thích của tin nhắn. Đây là cách giải thích của tôi.

Theo như tôi hiểu, Chrome đã mong đợi một số tài liệu mà nó có thể hiển thị (một tài liệu ), nhưng nó đã thu được thứ gì đó mà nó không thể hiển thị (hoặc thứ gì đó được bảo là không hiển thị).

Đây vừa là câu hỏi về cách tài liệu được khai báo ở cấp độ trang HTML trong href(xem downloadthuộc tính trong thông báo của Roy) và cách nó được khai báo trong câu trả lời của máy chủ bằng các tiêu đề HTTP (cụ thể Content-Disposition). Đây là một câu hỏi về hợp đồng , trái ngược với hy vọng và kỳ vọng.

Để tiếp tục theo cách của Evan, tôi đã trải nghiệm rằng:

Content-type: application/pdf
Content-disposition: attachment; filename=some.pdf

chỉ phù hợp với:

<a href='some.pdf'>

Chrome sẽ khóc Tài nguyên được hiểu là tài liệu nhưng đã chuyển

Trên thực tế, bố trí tệp đính kèm chỉ có nghĩa như vậy: trình duyệt sẽ không diễn giải liên kết, mà là lưu trữ nó ở đâu đó cho các mục đích khác của Hidden Hidden. Ở đây, hoặc downloadbị thiếu bên cạnh href, hoặc Content-dispositionphải được loại bỏ khỏi các tiêu đề. Nó phụ thuộc vào việc chúng ta có muốn trình duyệt hiển thị tài liệu hay không.

Hi vọng điêu nay co ich.


9

Tôi đã gặp vấn đề tương tự ngày hôm nay với Phiên bản Chrome 30.0.1599.66 với ứng dụng node.js / express.js của tôi.

Các tiêu đề chính xác, express đặt chúng tự động đúng cách, nó hoạt động trong các trình duyệt khác như được chỉ định, đặt thuộc tính html 5 'download' không giải quyết được, điều gì đã giải quyết nó đang đi vào cài đặt nâng cao chrome và chọn hộp "Hỏi nơi lưu từng tập tin trước khi tải xuống ".

Sau đó, không có lỗi "Tài nguyên được hiểu là tài liệu ...." được báo cáo như trong tiêu đề của vấn đề này nên có vẻ như mã máy chủ của chúng tôi là chính xác, đó là Chrome báo cáo không chính xác lỗi đó trong bảng điều khiển khi được đặt thành lưu tập tin đến một vị trí tự động.


9

Tôi gặp vấn đề tương tự khi thực hiện tải xuống tệp qua Javascript. Việc thêm thuộc tính tải xuống không có gì khác biệt nhưng việc thêm mục tiêu = '_ blank' đã làm - Tôi không còn nhận được thông báo bảng điều khiển 'Tài nguyên được hiểu là Tài liệu ...'.

Đây là mã đơn giản của tôi:

var link = document.createElement('a');
link.target = '_blank';
link.href = url;
document.body.appendChild(link); // Required for Firefox
link.click();
link.remove(); 

Tôi đã không thử nó với HTML trực tiếp nhưng sẽ mong nó hoạt động.

Lưu ý Tôi phát hiện ra rằng Firefox yêu cầu liên kết phải được thêm vào tài liệu trong khi Chrome sẽ hoạt động mà không có nó.


4
chỉ là một cảnh báo, một mục tiêu = '_blank' sẽ kích hoạt cơ chế ngăn chặn cửa sổ bật lên của IE 11 ...
RobM

4

Tôi đã gặp điều này khi tôi gán src = "image_url" trong iframe. Có vẻ như iframe diễn giải nó như một tài liệu nhưng thực tế không phải vậy. Đó là lý do tại sao nó hiển thị một cảnh báo.


bạn có thể vui lòng cho tôi biết bạn đã sửa nó như thế nào không? như tôi đang đối mặt với cùng một vấn đề ở đây khi sử dụng iframe
Shikha thakur

Tôi đã sử dụng dữ liệu biểu mẫu: var photoData = new FormData(); và sau đó đặt thuộc tính contentType: falsetrong yêu cầu ajax của tôi. Yêu cầu bài đăng sẽ là: Content-Disposition: form-data;Và loại nội dungContent-Type: text/html
Carmela

3

Tôi đã giải quyết vấn đề bằng cách adding target="_blank"liên kết. Với điều này, chrome mở một tab mới và tải PDF mà không cần cảnh báo ngay cả trong chế độ phản hồi.


Tôi đã làm điều này và nó hoạt động: window.open(href, '_blank');và tab mới tự động đóng lại sau khi tải xuống.
Chad Richardson

1

Tôi đã có vấn đề này trong một dự án trang web ASP. Việc thêm tiêu đề "Độ dài nội dung" khiến các bản tải xuống bắt đầu hoạt động trở lại trong Chrome.


1

Vấn đề này đã xuất hiện lại ở phiên bản Chrome 61. Nhưng có vẻ như nó đã được sửa ở Chrome 62.

Tôi có một RewriteRule như dưới đây

RewriteRule ^/ShowGuide/?$ https://<website>/help.pdf [L,NC,R,QSA]

Với Chrome 61, tệp PDF không mở, trong bảng điều khiển, nó hiển thị thông báo

"Resource interpreted as Document but transferred with MIME type application/pdf: "

Chúng tôi đã cố gắng thêm loại mime trong quy tắc viết lại như dưới đây nhưng không được.

RewriteRule ^/ShowGuide/?$ https://<website>/help.pdf [L,NC,R,QSA, t:application/pdf]

Tôi đã cập nhật Chrome của mình lên phiên bản 62 mới nhất và nó bắt đầu hiển thị lại PDF. Nhưng tin nhắn vẫn còn đó trong giao diện điều khiển.

Với tất cả các trình duyệt khác, nó đã / đang hoạt động tốt.


1

Chỉ cần chạy vào đây và không có thông tin nào khác tôi có thể tìm thấy giúp đỡ: đó là một lỗi ngu ngốc: Tôi đã gửi đầu ra cho trình duyệt trước khi bắt đầu tải xuống tệp. Đáng ngạc nhiên, tôi không tìm thấy lỗi hữu ích nào (như "tiêu đề đã được gửi", v.v.). Hy vọng, điều này sẽ cứu người khác một số đau buồn!


0

Trong trường hợp của tôi, tên tệp quá dài và có cùng một lỗi. Sau khi rút ngắn dưới 200 ký tự hoạt động tốt. (giới hạn có thể là 250?)


0

Tôi gặp lỗi này vì tôi đang phục vụ từ hệ thống tập tin của mình. Khi tôi bắt đầu với một máy chủ http chrome có thể tìm ra nó.


0

Tôi đã gặp rắc rối tương tự với trình quản lý tải xuống mà tôi đã tạo. Vấn đề tôi gặp phải là tên tệp quá dài và phần mở rộng bị cắt bớt.

Ví dụ: Tên tệp: Giao thức tổ chức và những thứ khác quan trọng.pd

<?php
  header("Content-Disposition: attachment; filename=$File_Name");
?>

Giải pháp: Tăng trường cơ sở dữ liệu MySQL lên 255 để lưu trữ tên tệp và thực hiện kiểm tra độ dài trước khi lưu blob. Nếu độ dài> 255 cắt nó xuống 250 và thêm phần mở rộng tập tin.


0

Hãy thử mã dưới đây và tôi hy vọng điều này sẽ làm việc cho bạn.

var Interval = setInterval(function () {
                if (ReportViewer) {
                    ReportViewer.prototype.PrintReport = function () {
                        switch (this.defaultPrintFormat) {
                            case "Default":
                                this.DefaultPrint();
                                break;
                            case "PDF":
                                this.PrintAs("PDF");
                                previewFrame = document.getElementById(this.previewFrameID);
                                previewFrame.onload = function () { previewFrame.contentDocument.execCommand("print", true, null); }
                                break;
                        }
                    };
                    clearInterval(Interval);
                }
            }, 1000);

0

Tôi đã phải đối mặt với điều này ngày hôm nay, và vấn đề của tôi Content-Dispositionlà thẻ của tôi đã được đặt sai. Có vẻ như cho cả hai pdf& application/x-zip-compressed, bạn phải đặt nó inlinethay vìattachment .

Vì vậy, để đặt tiêu đề của bạn, mã Java sẽ trông như thế này:

...
String fileName = "myFileName.zip";
String contentDisposition = "attachment";
if ("application/pdf".equals(contentType)
    || "application/x-zip-compressed".equals(contentType)) {
    contentDisposition = "inline";
}
response.addHeader("Content-Disposition", contentDisposition + "; filename=\"" + fileName + "\"");
...
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.