2

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?

Lokheed
  • 71
  • 1
  • 3

3 Answers3

5

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();
Fulvio
  • 1,615
  • 1
  • 16
  • 18
  • Useful for ***Android*** and _Chrome_: `Android and the HTTP download file headers` http://www.digiblog.de/2011/04/android-and-the-download-file-headers/ http://stackoverflow.com/questions/4674737/avoiding-content-type-issues-when-downloading-a-file-via-browser-on-android/5728859#comment46671021_5728859 – Kiquenet Jan 25 '17 at 15:39
0

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.

Prasanna
  • 3,703
  • 9
  • 46
  • 74
0

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.

JoshNaro
  • 2,047
  • 2
  • 20
  • 40