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

时间:2011-07-05 18:47:20

标签: javascript google-chrome

使用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中正常运行,如果我打开新标签页并直接转到http://0.0.0.0:3000/files/download.zip,该功能在Chrome中也能正常运行。我做错了什么,或者这是Chrome的错误/怪癖?

20 个答案:

答案 0 :(得分:149)

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

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

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

答案 1 :(得分:31)

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

答案 2 :(得分:24)

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

Content-Disposition: attachment; filename=foo.pdf

希望有所帮助。

答案 3 :(得分:20)

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

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

答案 4 :(得分:18)

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

据我了解,Chrome期待可能显示的某些材料(文档),但它获得了无法显示的内容(或者被告知不显示的内容)。< / p>

这是一个关于如何在href中的HTML页面级别声明文档的问题(请参阅Roy的消息中的download属性)以及如何通过均值在服务器的答案中声明它HTTP标头(特别是Content-Disposition)。这是合同的问题,而不是希望和期望。

继续Evan的方式,我经历过:

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

只是不一致 with:

<a href='some.pdf'>

Chrome会将资源解释为文档但已转移...

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

希望这有帮助。

答案 5 :(得分:8)

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

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

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

答案 6 :(得分:4)

当我分配了src =&#34; image_url&#34;在iframe中。 似乎iframe将其解释为文档,但事实并非如此。这就是它显示警告的原因。

答案 7 :(得分:3)

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

答案 8 :(得分:2)

我在ASP网站项目中遇到过这个问题。添加“内容长度”标题会导致下载内容再次在Chrome中重新开始工作。

答案 9 :(得分:1)

问题

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

<块引用>

资源被解释为 Document 但以 MIME 类型 text/csv 传输

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

<块引用>

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

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

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

解决办法

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

答案 10 :(得分: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。但是消息仍在控制台中。

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

答案 11 :(得分:1)

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

答案 12 :(得分:0)

我遇到了与我创建的下载管理器相同的问题。我遇到的问题是文件名太长而且扩展名被剪掉了。

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

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

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

答案 15 :(得分: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);

答案 16 :(得分:0)

我今天遇到了这个问题,我的问题是我的Content-Disposition标签设置有误。 对于pdfapplication/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 + "\"");
...

答案 17 :(得分:0)

问题

我直接引用了赛义德·尼玛提 (https://stackoverflow.com/a/6587434/760777):

<块引用>

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

解决方案

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

如何?

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

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

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

<form method="get" action="test.mp3"> 
  <a href="#" onclick="this.closest(form).submit();return false;" target="_blank">
    <span class="material-icons">
      download
    </span>
  </a>
</form>

我把它改成这样:

<form method="get" action="test.mp3" enctype="multipart/form-data"> 
  <a href="#" onclick="this.closest(form).submit();return false;" target="_blank">
    <span class="material-icons">
      download
    </span>
  </a>
</form>

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

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

答案 18 :(得分:0)

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

答案 19 :(得分:-1)

我遇到了同样的错误,解决方法是放置属性

target = "_ blank"

最后:

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

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