使用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的bug/怪癖?
我在任何地方都找不到对这条信息本身的解释。以下是我的解读。
据我所知,Chrome期待一些它可能显示的材料(一个文档),但它得到了一些它不能显示的东西(或者它被告知不显示的东西)。
这既是一个如何在href中的HTML页面级别声明文档的问题(参见Roy的消息中的下载属性),也是一个如何在服务器的应答中通过HTTP报头(特别是Content-Disposition)声明文档的问题。这是一个契约的问题,而不是希望和期望。
为了继续埃文的道路,我经历了:
Content-type: application/pdf
Content-disposition: attachment; filename=some.pdf
只是不符合:
<a href='some.pdf'>
Chrome将哭泣资源解释为文档,但传输…
实际上,附件配置的意思是:浏览器不解释链接,而是将其存储在某个地方以用于其他隐藏的目的。在上面这里,要么下载在href旁边缺失,要么Content-disposition必须从头文件中删除。这取决于我们是否希望浏览器呈现文档。
希望这能有所帮助。
Chrome 61版本再次出现此问题。但它似乎是固定的Chrome 62。
我有一个重写规则如下
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了。但是消息仍然在控制台中。
在所有其他浏览器中,它都可以正常工作。
这个问题
我引用了Saeed Neamati (https://stackoverflow.com/a/6587434/760777):)的话
在请求头中,您发送了Content-Type: text/html,这意味着您希望将响应解释为html。现在即使服务器发送PDF文件给你,你的浏览器也会将其理解为HTML。
解决方案
发送该死的正确头。发送文件的正确mime类型。期!
How?
啊。这完全取决于你在做什么(操作系统,语言)。
我的问题是用javascript动态创建的下载链接。这个链接是下载mp3文件的。
mp3文件不是文档,pdf文件、zip文件、flac文件也不是文档,这样的例子不胜枚举。
所以我创建了这样的链接:
<form method="get" action="test.mp3">
<a href="#" onclick="this. nearest (form).submit();return false;" target="_blank"> .
< span class = " material-icons”>
下载
< / span >
< / >
> < /形式
我把它改成了这样:
<form method="get" action="test.mp3" enctype="multipart/form-data"> .
<a href="#" onclick="this. nearest (form).submit();return false;" target="_blank"> .
< span class = " material-icons”>
下载
< / span >
< / >
> < /形式
问题解决了。向form标签添加一个额外的属性就解决了这个问题。但没有通用的解决方案。有很多不同的场景。
当你从服务器发送一个文件时(你用像cx#, Java, PHP这样的语言动态创建它),你必须发送正确的头文件。
旁注:在发送标题之前,注意不要发送任何东西(文本!)。
这个问题
我也有类似的问题。
在js中获得消息
资源解释为文档,但以MIME类型text/csv传输
但我也在chrome控制台收到消息
混合内容:“https://my-site/”网站已加载
通过安全连接,但文件在
“https://my-site/Download?id = 99 a50c7b
通过不安全连接重定向。这个文件应该是
通过HTTPS服务。此下载已被阻止
这里说你需要使用一个安全的连接(但scheme在消息中已经是https了,奇怪…)
问题是href文件下载构建在服务器端。这个href在我的例子中使用了http。
解决方案
所以我在构建href文件下载时将scheme更改为https。