来自 asp 应用程序的流式 mime 类型“应用程序/pdf”在 Google Chrome 中失败

Posted

技术标签:

【中文标题】来自 asp 应用程序的流式 mime 类型“应用程序/pdf”在 Google Chrome 中失败【英文标题】:Streaming mime type 'application/pdf' from asp app fails in Google Chrome 【发布时间】:2011-09-13 05:54:52 【问题描述】:

我有一个网络应用程序,可以在点击事件上流式传输 PDF 文件,它在 IE、Firefox 和 Safari 中运行良好,但在 Chrome 中它从不下载。下载只是显示“中断”。 Chrome 处理流媒体的方式不同吗?我的代码如下:

        this.Page.Response.Buffer = true;
        this.Page.Response.ClearHeaders();
        this.Page.Response.ClearContent();
        this.Page.Response.ContentType = "application/pdf";
        this.Page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
        Stream input = reportStream;
        Stream output = this.Page.Response.OutputStream;
        const int Size = 4096;
        byte[] bytes = new byte[4096];
        int numBytes = input.Read(bytes, 0, Size);
        while (numBytes > 0)
        
            output.Write(bytes, 0, numBytes);
            numBytes = input.Read(bytes, 0, Size);
        

        reportStream.Close();
        reportStream.Dispose();
        this.Page.Response.Flush();
        this.Page.Response.Close();

关于我可能缺少什么的任何建议?

【问题讨论】:

【参考方案1】:

最近的 Google Chrome v12 版本 introduced a bug 触发了您描述的问题。

您可以通过发送 Content-Length 标头来修复它,如以下修改后的代码版本:

this.Page.Response.Buffer = true;
this.Page.Response.ClearHeaders();
this.Page.Response.ClearContent();
this.Page.Response.ContentType = "application/pdf";
this.Page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
Stream input = reportStream;
Stream output = this.Page.Response.OutputStream;
const int Size = 4096;
byte[] bytes = new byte[4096];
int totalBytes = 0;
int numBytes = input.Read(bytes, 0, Size);
totalBytes += numBytes;
while (numBytes > 0)

    output.Write(bytes, 0, numBytes);
    numBytes = input.Read(bytes, 0, Size);
    totalBytes += numBytes;


// You can set this header here thanks to the Response.Buffer = true above
// This header fixes the Google Chrome bug
this.Page.Response.AddHeader("Content-Length", totalBytes.ToString());

reportStream.Close();
reportStream.Dispose();
this.Page.Response.Flush();
this.Page.Response.Close();

【讨论】:

androidChrome 有用:Android and the HTTP download file headersdigiblog.de/2011/04/android-and-the-download-file-headers***.com/questions/4674737/…【参考方案2】:

这只是一个猜测。在 chrome 中,当您在 HTTP 标头中的 Accept 或 Content-Type 中指定了多种格式时,它会使用逗号而不是分号来分隔它们(分号是标准)。当出现逗号时,某些框架实际上几乎每个框架都无法解析并抛出堆栈跟踪。您可以通过在 chrome 中使用 firebug 来验证情况并非如此。

【讨论】:

【参考方案3】:

看起来 Chrome 倾向于拆分请求并分段请求文件。这可能是你问题的症结所在,它在我身上。

【讨论】:

以上是关于来自 asp 应用程序的流式 mime 类型“应用程序/pdf”在 Google Chrome 中失败的主要内容,如果未能解决你的问题,请参考以下文章

拒绝应用来自 'xxx/style.css' 的样式,因为它的 MIME 类型 ('text/html') 不是受支持的样式表 MIME 类型

“拒绝应用来自 link 的样式,因为它的 MIME 类型不受支持且已启用严格的 MIME checkinis。”在 Vue+Vuetify 应用中

来自 AWS Elastic Beanstalk 的 Mime 类型错误

由于不允许的 MIME 类型(“text/html”),ASP Net Core 内部的 Angular 8 被阻止

拒绝应用样式,因为 MIME 类型

将音频从浏览器流式传输到具有特定 MIME 类型的 node.js 服务器