Поток PDF на веб-страницу не удается - PullRequest
2 голосов
/ 27 января 2009

У меня есть URL-адрес к PDF-файлу, и я хочу отправить PDF-файл своему просмотрщику страниц.

Я могу (я думаю) успешно извлечь файл PDF. Затем, когда я выполняю Response.BinaryWrite (), я получаю сообщение об ошибке «Файл поврежден и не может быть восстановлен» из программы Adobe Reader.

Вот код, который у меня есть:

protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            byte[] output = DoWork("Http://localhost/test.pdf");
            Response.Clear();
            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "inline; filename=MyPDF.PDF");
            Response.AddHeader("content-length", output.Length.ToString());
            Response.BinaryWrite(output);
            Response.End();
        }
    }

    public byte[] DoWork(string requestUrl)
    {
        byte[] responseData;
        HttpWebRequest req = null;
        HttpWebResponse resp = null;
        StreamReader strmReader = null;

        try
        {
            req = (HttpWebRequest)WebRequest.Create(requestUrl);

            using (resp = (HttpWebResponse)req.GetResponse())
            {
                byte[] buffer = new byte[resp.ContentLength];
                BinaryReader reader = new BinaryReader(resp.GetResponseStream());
                reader.Read(buffer, 0, buffer.Length);
                responseData = buffer;
            }
        }
        finally
        {
            if (req != null)
            {
                req = null;
            }

            if (resp != null)
            {
                resp.Close();
                resp = null;
            }
        }

        return responseData;

    }

Ответы [ 6 ]

3 голосов
/ 27 января 2009

Очевидно, мне нужно использовать ReadBytes (). По какой-то причине при чтении PDF-файла с URL-адреса вы не получаете все запрошенные байты.

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            byte[] output = DoWork("Http://localhost/test.pdf");
            Response.Clear();
            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "attachment");
            Response.AddHeader("content-length", output.Length.ToString());
            Response.BinaryWrite(output);
            Response.End();
        }
    }

    public byte[] DoWork(string requestUrl)
    {
        byte[] responseData;
        HttpWebRequest req = null;
        HttpWebResponse resp = null;
        StreamReader strmReader = null;

        try
        {
            req = (HttpWebRequest)WebRequest.Create(requestUrl);

            using (resp = (HttpWebResponse)req.GetResponse())
            {
                byte[] buffer = new byte[resp.ContentLength];
                using (BinaryReader reader = new BinaryReader(resp.GetResponseStream()))
                {
                    buffer = reader.ReadBytes(buffer.Length);
                    reader.Close();
                }
                responseData = buffer;
            }
        }
        finally
        {
            if (req != null)
            {
                req = null;
            }

            if (resp != null)
            {
                resp.Close();
                resp = null;
            }
        }

        return responseData;

    }
1 голос
/ 01 июля 2009

Вы также можете попробовать использовать FileStream для чтения файла

 string strPath = Request.PhysicalApplicationPath 
                  + "\\document\\Test.pdf";
 FileStream fStream = new FileStream
            (strPath, FileMode.Open, FileAccess.Read);
 StreamReader sReader = new StreamReader(fStream);
1 голос
/ 27 января 2009

Попробуйте сохранить полученный файл на свой диск. Затем откройте файл в текстовом редакторе. Возможно, в вашем скрипте / исходном файле есть ошибки.

0 голосов
/ 28 января 2009

Возможно, вы сможете немного упростить свой код, используя класс WebClient

Вот документация MSDN. Это не так громоздко, как класс HttpWebRequest нижнего уровня.

0 голосов
/ 27 января 2009

Когда я сделал это в Perl на днях (как быстрый хак для нашей интрасети), суть сценария была:

binmode(STDOUT);
print "Content-type: application/pdf\n\n";
binmode(FILE);
print <FILE>;
close(FILE);

Ключевым моментом является то, чтобы убедиться, что входные потоки и находятся в двоичном режиме, то есть, как вы обнаружили, PDF должен интерпретироваться как двоичные данные по всей цепочке.

0 голосов
/ 27 января 2009

Попробуйте сбросить ответ после двоичной записи ...

Response.BinaryWrite(output);
Response.Flush();
Response.End();

В качестве альтернативы, вместо встроенного, попробуйте вывести PDF в виде вложения:

Response.AddHeader("Content-Disposition", "attachment;filename=MyPDF.PDF");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...