使用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的错误/怪癖?
答案 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
标签设置有误。
对于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 + "\"");
...
答案 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>
*
是要下载文件的扩展名。