ChatGPT解决这个技术问题 Extra ChatGPT

资源被解释为 Document 但使用 MIME 类型 application/zip 传输

使用 Chrome 12.0.742.112,如果我使用以下标头重定向:

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

如果跟随返回以下标题:

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 不会重定向,也不会更改上一页,它只会在控制台中报告以下警告:

资源解释为 Document,但使用 MIME 类型 application/zip 传输。

该过程在 Firefox 中正常运行,如果我打开一个新标签并直接转到 http://0.0.0.0:3000/files/download.zip,也可以在 Chrome 中正常运行。我做错了什么,还是这是 Chrome 的错误/怪癖?


R
Roy Hyunjin Han

您可以在 标记中指定 HTML5 下载属性。

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

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


ie 或其他浏览器不支持“下载”属性。如果您有其他选择,请帮助我
这可以修复 Chrome,但会破坏其他浏览器。我的 Android 手机不会从那种链接下载。
叹。此“修复”不适用于大多数浏览器 - 仅适用于 Chrome。现在是 2016 年,所以也不要指望它很快。
在 Chrome 2019 中没有什么不同
@all 现在是 2035 年(我来自未来),没有计算机可以支持这一点。
S
Saeed Neamati

在您的请求标头中,您发送了 Content-Type: text/html,这意味着您希望将响应解释为 HTML。现在,即使服务器向您发送 PDF 文件,您的浏览器也会尝试将其理解为 HTML。那就是问题所在。我正在寻找可能是什么原因。 :)


我尝试将其作为 Content-Type: application/zip 发送但无济于事,它仍然尝试将其作为“文档”处理。可能还值得指出的是,zip URL 在我的应用程序中是动态的,因此与缓存无关。
谢谢!可能与 Chrome 将 Accept 请求标头作为 text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 发送有关吗?我在这里完全被难住了,我真的!
不,在 text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 中有一部分说 Chrome 接受几乎所有内容 (*/*)。
你在说什么?问题中没有请求标头。它们都是响应标头。
我坐在这里想知道为什么这应该是一个答案而不是评论?
2
2540625

我无法在任何地方找到对消息本身的解释。这是我的解释。

据我了解,Chrome 期待一些它可能显示的材料(文档),但它获得了一些它无法显示的东西(或者它被告知不要显示的东西)。

这既是一个问题,即如何在 href 中的 HTML 页面级别声明文档(请参阅 Roy 消息中的 download 属性),以及如何通过 HTTP 标头(特别是 { 3})。这是一个契约的问题,而不是希望和期望。

为了继续埃文的方式,我经历过:

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

只是不符合:

<a href='some.pdf'>

Chrome 会哭 资源解释为文档但已传输...

实际上,attachment 配置只是意味着:浏览器不应解释链接,而是将其存储在某个地方以用于其他隐藏目的。在上面,href 旁边缺少 download,或者必须从标题中删除 Content-disposition。这取决于我们是否希望浏览器呈现文档。

希望这可以帮助。


E
Evan

我在提供 PDF 文件(MIME 类型应用程序/pdf)时遇到了这个问题,并通过设置 Content-Disposition 标头解决了这个问题,例如:

Content-Disposition: attachment; filename=foo.pdf

希望有帮助。


但是在哪里写这个?
@coder您从您的网络服务器添加这样的标题。不确定您使用的是什么,因此很难提供更多信息。您的服务器使用什么语言或框架?
在我们的标题中有这个,但 Chrome 仍然会抛出警告
不,它没有修复 chrome 版本 76.0.3809.132(官方版本)(64 位)上的任何内容我已经附上了标题
A
Ashley Williams

我已经解决了这个问题……只需打开一个新标签。

为什么它不起作用我不完全确定,但这可能与 Chrome 如何处理页面上的多个下载有关,也许它认为它们是垃圾邮件而忽略了它们。


你是什么意思你“打开一个新标签”???您手动打开了一个新的浏览器窗口并将下载 URL 粘贴在那里?
对,就是这样。我认为这是特定选项卡的应用程序状态中的错误。
我不希望用户打开一个新标签......而且我也没有发现打开一个下载文件的优雅。
@Joram 等。人。 - 打开一个选项卡进行下载(使用目标'_blank') - 不能解决问题,它只是将“资源解释为文档”控制台警告消息传输到新选项卡。躲在地毯下不是解决办法。
这显然不能解决原始答案。说真的......我会在用户文档“复制网址,打开一个新标签,粘贴网址,......”中输入什么?生意低迷。
E
Elliveny

通过 Javascript 执行文件下载时,我遇到了类似的问题。添加下载属性没有区别,但添加 target='_blank' 确实 - 我不再收到“资源解释为文档...”控制台消息。

这是我非常简单的代码:

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

我还没有尝试过直接使用 HTML,但希望它可以工作。

注意我发现 Firefox 需要将链接附加到文档中,而 Chrome 没有它也可以工作。


只是一个警告,a target = '_blank' 将触发 IE 11 的弹出防止机制...
仅供参考,我确实在 Chrome(版本 87.0.4280.141,64 位)中使用直接 HTML 对其进行了测试,但它不起作用。
J
JohnC

我今天在我的 node.js / express.js 应用程序中使用 Chrome 版本 30.0.1599.66 时遇到了同样的问题。

标题是正确的,express 自动正确设置它们,它可以在其他浏览器中工作,如所示,放置 html 5 'download' 属性无法解析,解决它的原因是进入 chrome 高级设置并选中框“询问保存位置下载前的每个文件”。

之后,没有像此问题的标题一样报告“资源解释为文档....”错误,因此我们的服务器代码似乎是正确的,当它设置为保存时,Chrome 在控制台中错误地报告了该错误文件自动保存到某个位置。


C
Carmela

我在 iframe 中分配 src="image_url" 时遇到了这个问题。似乎 iframe 将其解释为文档,但事实并非如此。这就是它显示警告的原因。


你能告诉我你是怎么修的吗?因为我在使用 iframe 时遇到了同样的问题
我使用了表单数据:var photoData = new FormData();,然后在我的 ajax 请求中设置了属性 contentType: false。发布请求将是:Content-Disposition: form-data; 和内容类型 Content-Type: text/html
A
AS Mackay

我通过链接的adding target="_blank"解决了这个问题。这样,即使在响应模式下,chrome 也会打开一个新选项卡并加载 PDF 而不会发出警告。


我这样做了,它起作用了:window.open(href, '_blank');,下载后新标签会自动关闭。
u
user6096790

刚遇到这个,我能找到的其他信息都没有帮助:这是一个愚蠢的错误:我在开始下载文件之前将输出发送到浏览器。令人惊讶的是,我没有发现任何有用的错误(例如“标头已发送”等)。希望这可以减轻其他人的痛苦!


R
R. Salisbury

我在一个 ASP 网站项目中遇到了这个问题。添加“Content-Length”标头会导致在 Chrome 中重新开始下载。


A
Asif Nowaj

这个问题在 Chrome 61 版本中再次出现。但它似乎固定在 Chrome 62 上。

我有一个如下所示的 RewriteRule

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

使用 Chrome 61,PDF 未打开,在控制台中显示消息

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

我们尝试在重写规则中添加 mime 类型,如下所示,但没有帮助。

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

我已将我的 Chrome 更新到最新的 62 版本,它再次开始显示 PDF。但是消息仍然存在于控制台中。

对于所有其他浏览器,它一直/正在正常工作。


m
milkyWay

问题

我有类似的问题。在 js 中收到消息

资源解释为文档,但使用 MIME 类型 text/csv 传输

但我也在 chrome 控制台中收到消息

混合内容:“https://my-site/”的站点是通过安全连接加载的,但“https://my-site/Download?id=99a50c7b”的文件是通过不安全的连接重定向的。此文件应通过 HTTPS 提供。此下载已被阻止

它在这里说您需要使用安全连接(但奇怪的是,消息中的方案已经是 https 了......)。

问题是用于文件下载的 href 建立在服务器端。而这个href在我的例子中使用了http。

解决方案

所以我在构建文件下载href时将方案更改为https。


h
holdfenytolvaj

在我的情况下,文件名太长,并且得到了同样的错误。一旦缩短到 200 个字符以下就可以正常工作。 (限制可能是 250?)


B
Brian Deterling

在下载了几个 csv 文件(大量测试)后,chrome 询问是否允许从此页面进行更多下载。我只是关闭了窗口。之后,chrome 不再下载该文件,但控制台显示:

“资源解释为文档,但使用 MIME 类型文本/csv 传输”

我可以通过重新启动 chrome(完全是 Ctrl-Shift-Q)来解决这个问题。

[更新] 不知道为什么这篇文章被删除,但它为我提供了解决方案。我之前收到了有关尝试下载多个文件的消息,并且肯定回答没有。在我重新启动浏览器之前,我收到了“资源解释...”消息;然后它完美地工作。在某些情况下,这可能是正确的答案。


R
Rashi Abramson

我收到此错误是因为我是从我的文件系统提供服务的。一旦我开始使用 http 服务器 chrome 就可以弄清楚。


e
eradima

我创建的下载管理器遇到了同样的问题。我遇到的问题涉及文件名太长并且扩展名被剪掉。

示例:文件名:组织协议和其他重要事项.pd

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

解决方案:将 MySQL 数据库字段增加到 255 以存储文件名,并在保存 blob 之前进行长度检查。如果长度 > 255 将其修剪为 250 并添加文件扩展名。


F
Faraz

试试下面的代码,我希望这对你有用。

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);

O
Olivier B.

我今天遇到了这个问题,我的问题是我的 Content-Disposition 标记设置错误。它看起来像 pdf & application/x-zip-compressed,您应该将其设置为 inline 而不是 attachment

因此,要设置您的标头,Java 代码将如下所示:

...
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 + "\"");
...

R
RWC

问题

我从字面上引用了 Saeed Neamati (https://stackoverflow.com/a/6587434/760777):

在您的请求标头中,您发送了 Content-Type: text/html 这意味着您希望将响应解释为 HTML。现在,即使服务器向您发送 PDF 文件,您的浏览器也会尝试将其理解为 HTML。

解决方案

发送该死的正确标题。发送文件的正确 mime 类型。时期!

如何?

啊。这完全取决于你在做什么(操作系统、语言)。

我的问题是在 javascript 中动态创建的下载链接。该链接用于下载 mp3 文件。 mp3 文件不是文档,pdf、zip 文件、flac 文件也不是文档,不胜枚举。

所以我创建了这样的链接:

下载

我把它改成这样:

下载

问题解决了。向表单标签添加一个额外的属性解决了它。但是没有通用的解决方案。有很多不同的场景。当您从服务器发送文件时(您使用 CX#、Java、PHP 等语言动态创建它),您必须随其发送正确的标头。

旁注:在发送标题之前,请注意不要发送任何内容(文本!)。


A
Alexander Ramos

我得到了同样的错误,解决方案是把属性

target = "_ blank"

最后 :

<a href="/uploads/file.*" target="_blank">Download</a>

其中 * 是要下载的文件的扩展名。


这不是解决方案。它只是打开一个新选项卡并下载该选项卡中的文件。发生的任何错误/警告也会在该选项卡的调试控制台中报告,而不是在当前选项卡的调试控制台中报告。现在,您只是看不到问题所在。但是,实际上它并不固定。