使用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/怪癖?


当前回答

我在通过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不需要它也可以工作。

其他回答

这个问题

我也有类似的问题。 在js中获得消息

资源解释为文档,但以MIME类型text/csv传输

但我也在chrome控制台收到消息

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

这里说你需要使用一个安全的连接(但scheme在消息中已经是https了,奇怪…)

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

解决方案

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

尝试下面的代码,我希望这将为您工作。

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);

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

标题是正确的,表达设置他们正确地自动,它在其他浏览器中工作,如所示,把html 5的“下载”属性不解决,什么解决它是进入chrome高级设置,并勾选框“询问在下载前保存每个文件的位置”。

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

只是遇到了这个问题,我能找到的其他信息都没有帮助:这是一个愚蠢的错误:在开始下载文件之前,我正在向浏览器发送输出。令人惊讶的是,我没有发现有用的错误(如“头部已发送”等)。希望这能帮其他人减轻一些痛苦!

这个问题

我引用了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这样的语言动态创建它),你必须发送正确的头文件。

旁注:在发送标题之前,注意不要发送任何东西(文本!)。