Streaming mime type 'application/pdf' from asp app fails in Google Chrome
I have a web application that streams a PDF file on a click event, it works fine in IE, Firefox, and Safari but in Chrome it never download. The download just reads "Interrupted". Does Chrome handle streaming differently? My code looks like:
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();
Any suggestions as to what I might be missing?
A recent Google Chrome v12 release introduced a bug that triggers the problem you describe.
You can fix it by sending the Content-Length header, as in the following modified version of your code:
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();
This is just a guess. In chrome, when you have multiple formats specified in Accept or Content-Type within HTTP header it delimits them using a comma instead of a semi-colon (semi-colon is the standard). When presented with a comma, some frameworks, actually pretty much every framework fails parsing and throws a stack trace. You can verify that this is not the case by using firebug in chrome.
It looks like Chrome tends to split up requests and asks for the file in pieces. This may be the crux of your problem, it is with me.
精彩评论