Потеря MIME-типа «application / pdf» из приложения asp не работает в Google Chrome - PullRequest
2 голосов
/ 12 июня 2011

У меня есть веб-приложение, которое передает потоковый файл 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();

Какие-нибудь предложения относительно того, что я мог бы пропустить?

Ответы [ 3 ]

5 голосов
/ 30 июня 2011

Недавний выпуск Google Chrome v12 представил ошибку , которая вызывает описанную проблему.

Вы можете исправить это, отправив заголовок 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();
0 голосов
/ 10 декабря 2011

Похоже, что Chrome имеет тенденцию разделять запросы и запрашивает файл по частям. Это может быть суть вашей проблемы, это со мной.

0 голосов
/ 12 июня 2011

Это всего лишь предположение.В chrome, когда в заголовке HTTP указано несколько форматов, указанных в Accept или Content-Type, он разделяет их запятой вместо точки с запятой (стандартная точка с запятой)Когда передается запятая, некоторые фреймворки, практически все фреймворки, не разбираются и выдают трассировку стека.Вы можете убедиться, что это не так, используя Firebug в Chrome.

...