资源被解释为文档,但以MIME类型application / zip传输


199

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

资源被解释为文档,但以MIME类型application / zip传输。

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


Answers:


168

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

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

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


3
IE或某些其他浏览器不支持“下载”属性。如果您还有其他选择,请帮助我
Renish Khunt 2015年

3
可以修复Chrome,但会破坏其他浏览器。我的Android手机无法从该链接下载。
贝蒂2015年

38
叹。此“修复”不适用于大多数浏览器-仅适用于Chrome。现在是2016年,因此也不要期待很快。
a20

2
不会在Chrome 2019中有所作为
Michael Rogers

16
@all是2035年(我来自未来),没有计算机支持此功能。
Ali Farhoudi

34

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


我尝试将其发送为Content-Type: application/zip无效,但仍尝试将其作为“文档”进行处理。值得指出的是,zip URL在我的应用程序中是动态的,因此与缓存无关。
Ashley Williams

1
谢谢!可能与Chrome发送Accept请求标头为text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8可能有关吗?我绝对被困在这里,我真的是!
Ashley Williams

5
不,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8其中有一部分说Chrome接受几乎所有内容(*/*)。
Saeed Neamati

3
你在说什么?问题中没有请求标头。它们都是响应头。
doubleDown

1
我坐在这里想知道为什么这应该是答案而不是评论?
资讯主页

24

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

Content-Disposition: attachment; filename=foo.pdf

希望能有所帮助。


11
但是在哪里写呢?
2016年

4
@coder您可以从网络服务器添加这样的标题。不知道您正在使用什么,因此很难提供更多信息。您要为服务器使用哪种语言或框架?
埃文(Evan)2016年

7
有这个在我们的头,但Chrome仍然会抛出警告
亚当李嘉欣

不会,它不能在chrome版本76.0.3809.132(正式版本)(64位)上修复任何问题-我已经连接了标头
穆罕默德·奥默·阿斯兰

22

我已经解决了这个问题,只需打开一个新标签页即可。

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


6
您是什么意思“打开新标签” ????您手动打开了一个新的浏览器窗口,并在其中粘贴了下载URL?
Tony R

2
对,就是这样。我认为这是特定选项卡的应用程序状态中的错误。
Ashley Williams

52
我不希望用户打开一个新选项卡...而且我也找不到打开一个选项卡来下载优雅文件。
Yassir Ennazk 2012年

24
@乔拉姆等 等 -打开下载选项卡(使用目标'_blank')-不能解决问题,只是将“文档解释为资源”控制台警告消息传送到新选项卡。扫地毯不是解决方案。
colm.anseo,2015年

1
这显然不能解决原始答案。认真地...我将在用户文档中输入“复制网址,打开新标签页,粘贴网址,...”吗?业务下降。
搁浅的孩子

22

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

据我了解,Chrome期望可以显示的某些内容(文档),但是获得了无法显示的内容(或告诉其不显示的内容)。

这既是关于如何在HTML页面级别上声明文档的问题href(请参见downloadRoy消息中的属性),又是如何通过HTTP标头(特别是Content-Disposition)在服务器的答案中声明文档的问题。这是合同问题,而不是希望和期望。

继续沿Evan的方式前进,我已经体验到:

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

刚刚不一致有:

<a href='some.pdf'>

Chrome会哭泣资源被解释为文档但已转移…

实际上,附件的配置仅意味着:浏览器不应解释该链接,而应将其存储在其他目的(隐藏的目的)中。在上面的此处,或者download在旁边丢失href,或者Content-disposition必须从标题中删除。这取决于我们是否要浏览器呈现文档。

希望这可以帮助。


9

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

标题正确的,表达它们设置适当的自动,它工作在指示其他浏览器,把HTML 5“下载”属性不解决,什么没有解决它是进入铬高级设置和检查框“请问哪里保存下载之前下载每个文件”。

之后,此问题的标题中未报告“将资源解释为文档...”错误,因此看来我们的服务器代码正确无误,而设置为保存时,是Chrome在控制台中错误地报告了该错误。文件自动保存到一个位置。


9

通过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可以在没有链接的情况下使用。


4
只是警告,目标='_blank'将触发IE 11的弹出窗口阻止机制...
RobM

4

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


能否请你说我是怎么解决的?因为我在使用iframe时遇到了同样的问题
Shikha thakur

我使用了表单数据: var photoData = new FormData(); 然后contentType: false在我的ajax请求中设置属性 。该职位要求为:Content-Disposition: form-data;内容类型Content-Type: text/html
卡梅拉(Carmela)2016年

3

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


我做到了,它奏效了:window.open(href, '_blank');下载后,新标签页会自动关闭。
乍得·理查森

1

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


1

此问题在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。但是消息仍在控制台中。

与所有其他浏览器一起,它运行正常。


1

碰到这个问题,我找不到其他信息可以帮助您:这是一个愚蠢的错误:我在开始下载文件之前将输出发送到浏览器。令人惊讶的是,我没有找到有用的错误(例如“已发送标题”等)。希望这可以使其他人免于悲痛!


0

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


0

我收到此错误,是因为我正在从文件系统提供服务。一旦我开始使用http服务器,chrome就可以解决问题。


0

我创建的下载管理器遇到了同样的麻烦。我遇到的问题是文件名太长,扩展名被剪切掉。

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

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

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


0

尝试以下代码,希望这对您有用。

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

我今天遇到了这个问题,我的问题是我的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 + "\"");
...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.