使用 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 的错误/怪癖?
您可以在 标记中指定 HTML5 下载属性。
<a href="http://example.com/archive.zip" download>Export</a>
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download
在您的请求标头中,您发送了 Content-Type: text/html
,这意味着您希望将响应解释为 HTML。现在,即使服务器向您发送 PDF 文件,您的浏览器也会尝试将其理解为 HTML。那就是问题所在。我正在寻找可能是什么原因。 :)
Content-Type: application/zip
发送但无济于事,它仍然尝试将其作为“文档”处理。可能还值得指出的是,zip URL 在我的应用程序中是动态的,因此与缓存无关。
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 接受几乎所有内容 (*/*
)。
我无法在任何地方找到对消息本身的解释。这是我的解释。
据我了解,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
。这取决于我们是否希望浏览器呈现文档。
希望这可以帮助。
我在提供 PDF 文件(MIME 类型应用程序/pdf)时遇到了这个问题,并通过设置 Content-Disposition 标头解决了这个问题,例如:
Content-Disposition: attachment; filename=foo.pdf
希望有帮助。
我已经解决了这个问题……只需打开一个新标签。
为什么它不起作用我不完全确定,但这可能与 Chrome 如何处理页面上的多个下载有关,也许它认为它们是垃圾邮件而忽略了它们。
通过 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 没有它也可以工作。
我今天在我的 node.js / express.js 应用程序中使用 Chrome 版本 30.0.1599.66 时遇到了同样的问题。
标题是正确的,express 自动正确设置它们,它可以在其他浏览器中工作,如所示,放置 html 5 'download' 属性无法解析,解决它的原因是进入 chrome 高级设置并选中框“询问保存位置下载前的每个文件”。
之后,没有像此问题的标题一样报告“资源解释为文档....”错误,因此我们的服务器代码似乎是正确的,当它设置为保存时,Chrome 在控制台中错误地报告了该错误文件自动保存到某个位置。
我在 iframe 中分配 src="image_url" 时遇到了这个问题。似乎 iframe 将其解释为文档,但事实并非如此。这就是它显示警告的原因。
var photoData = new FormData();
,然后在我的 ajax 请求中设置了属性 contentType: false
。发布请求将是:Content-Disposition: form-data;
和内容类型 Content-Type: text/html
我通过链接的adding target="_blank"
解决了这个问题。这样,即使在响应模式下,chrome 也会打开一个新选项卡并加载 PDF 而不会发出警告。
window.open(href, '_blank');
,下载后新标签会自动关闭。
刚遇到这个,我能找到的其他信息都没有帮助:这是一个愚蠢的错误:我在开始下载文件之前将输出发送到浏览器。令人惊讶的是,我没有发现任何有用的错误(例如“标头已发送”等)。希望这可以减轻其他人的痛苦!
我在一个 ASP 网站项目中遇到了这个问题。添加“Content-Length”标头会导致在 Chrome 中重新开始下载。
这个问题在 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。但是消息仍然存在于控制台中。
对于所有其他浏览器,它一直/正在正常工作。
问题
我有类似的问题。在 js 中收到消息
资源解释为文档,但使用 MIME 类型 text/csv 传输
但我也在 chrome 控制台中收到消息
混合内容:“https://my-site/”的站点是通过安全连接加载的,但“https://my-site/Download?id=99a50c7b”的文件是通过不安全的连接重定向的。此文件应通过 HTTPS 提供。此下载已被阻止
它在这里说您需要使用安全连接(但奇怪的是,消息中的方案已经是 https 了......)。
问题是用于文件下载的 href 建立在服务器端。而这个href在我的例子中使用了http。
解决方案
所以我在构建文件下载href时将方案更改为https。
在我的情况下,文件名太长,并且得到了同样的错误。一旦缩短到 200 个字符以下就可以正常工作。 (限制可能是 250?)
在下载了几个 csv 文件(大量测试)后,chrome 询问是否允许从此页面进行更多下载。我只是关闭了窗口。之后,chrome 不再下载该文件,但控制台显示:
“资源解释为文档,但使用 MIME 类型文本/csv 传输”
我可以通过重新启动 chrome(完全是 Ctrl-Shift-Q)来解决这个问题。
[更新] 不知道为什么这篇文章被删除,但它为我提供了解决方案。我之前收到了有关尝试下载多个文件的消息,并且肯定回答没有。在我重新启动浏览器之前,我收到了“资源解释...”消息;然后它完美地工作。在某些情况下,这可能是正确的答案。
我收到此错误是因为我是从我的文件系统提供服务的。一旦我开始使用 http 服务器 chrome 就可以弄清楚。
我创建的下载管理器遇到了同样的问题。我遇到的问题涉及文件名太长并且扩展名被剪掉。
示例:文件名:组织协议和其他重要事项.pd
<?php
header("Content-Disposition: attachment; filename=$File_Name");
?>
解决方案:将 MySQL 数据库字段增加到 255 以存储文件名,并在保存 blob 之前进行长度检查。如果长度 > 255 将其修剪为 250 并添加文件扩展名。
试试下面的代码,我希望这对你有用。
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);
我今天遇到了这个问题,我的问题是我的 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 + "\"");
...
问题
我从字面上引用了 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 等语言动态创建它),您必须随其发送正确的标头。
旁注:在发送标题之前,请注意不要发送任何内容(文本!)。
我得到了同样的错误,解决方案是把属性
target = "_ blank"
最后 :
<a href="/uploads/file.*" target="_blank">Download</a>
其中 *
是要下载的文件的扩展名。