Ошибка: при попытке открыть PDF в ASP.NET - PullRequest
0 голосов
/ 18 июня 2009

В моем приложении ASP.NET, когда я пытаюсь открыть файл PDF с помощью приведенного ниже кода, я получаю сообщение об ошибке

КОД ИСПОЛЬЗУЕТСЯ, ЧТОБЫ ПОКАЗАТЬ ФАЙЛ PDF

FileStream MyFileStream = new FileStream(filePath, FileMode.Open);
long FileSize = MyFileStream.Length;
byte[] Buffer = new byte[(int)FileSize + 1];
MyFileStream.Read(Buffer, 0, (int)MyFileStream.Length);
MyFileStream.Close();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment; filename="+filePath);
Response.BinaryWrite(Buffer);

ОШИБКА Я ПОЛУЧУ

«При открытии этого документа произошла ошибка. Файл поврежден и не может открыть»

Ответы [ 3 ]

1 голос
/ 19 июня 2009

Похоже, вы используете файл aspx для вывода PDF. Рассматривали ли вы использовать файл Ashx, который является HttpHandler? Он обходит все типичные служебные данные aspx и более эффективен для обслуживания необработанных данных.

Вот пример использования Ashx вашего кода:

<% WebHandler Language="c#" class="ViewPDF" %>
public class ViewPDF : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        FileStream MyFileStream = new FileStream(filePath, FileMode.Open);
        long FileSize = MyFileStream.Length;
        byte[] Buffer = new byte[(int)FileSize + 1];
        MyFileStream.Read(Buffer, 0, (int)MyFileStream.Length);
        MyFileStream.Close();
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment; filename="+filePath);
        Response.BinaryWrite(Buffer);
    }

    public bool IsReusable
    {
        get { return false; }
    }
}

Если вы все еще хотите использовать страницу aspx. Убедитесь, что вы делаете следующее:

// At the beginning before you do any response stuff do:
Response.Clear();

// When you are done all your response stuff do:
Response.End();

Это должно решить вашу проблему.

0 голосов
/ 18 июня 2009

В дополнение к ответу ocedcio вам необходимо знать, что Stream.Read() не обязательно считывает все запрошенные байты. Вам следует проверить возвращаемое значение из Stream.Read() и продолжить чтение, если прочитано меньше байтов, чем запрошено.

Подробнее см. Этот вопрос и ответ: Создание массива байтов из потока

0 голосов
/ 18 июня 2009

Вы должны сбросить ответ, иначе он будет частично передан.

Response.Flush();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...