Как прикрепить файл к ответу при визуализации страницы? - PullRequest
0 голосов
/ 25 июля 2011

Я получаю HTML-результаты загрузки моей страницы во время рендеринга страницы, затем присоединяю файл pdf к браузеру:

 protected override void Render(HtmlTextWriter writer)
    {
        if (isPdfExport)
        {
            var stringWriter = new StringWriter();
            var htmlWriter = new HtmlTextWriter(stringWriter);
            base.Render(htmlWriter);
            var pageHtml = stringWriter.ToString();
            Write(GetBytes(pageHtml));
        }
        else
        {
            base.Render(writer);
        }
    }

    private void Write(byte[] bytes)
    {
        System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
        response.Clear();
        response.AddHeader("Content-Type", "binary/octet-stream");
        response.AddHeader("Content-Disposition",
            "attachment; filename=MyFile.pdf; size=" + bytes.Length.ToString());
        response.Flush();
        response.BinaryWrite(bytes);
        response.Flush();
        response.End();
    }

Когда нажимается кнопка экспорта, она устанавливает isPdfExportЗначение true, чтобы метод Render знал, что он должен экспортировать.

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

если экспорт происходит в обработчике событий до Render, он работает нормально и выдает всплывающее окно, однако у меня нет доступа к html-данным страницы в любое время до обработчика событий Render.

Любая помощьочень ценится.

1 Ответ

1 голос
/ 25 июля 2011

Почему бы не настроить обработчик .pdf, поэтому все, что вам нужно сделать, это предоставить стандартную гиперссылку на файл .pdf, который затем предложит всплывающему окну сохранить файл?

например,

<a href="/Correspondence/12345.pdf">Download the PDF</a>

Для этого сначала необходимо определить обработчик в web.config в подкаталоге «Корреспонденция», чтобы обрабатывать файлы .pdf:

<configuration>
    <system.web>
        <httpHandlers>
            <add verb="*" path="*.pdf" type="PdfHandler"/>
        </httpHandlers>
    </system.web>
</configuration>

Затем вы пишете сам обработчикВот как это следует сделать:

Public Class PdfHandler
    Implements IHttpHandler

    Public ReadOnly Property IsReusable As Boolean Implements System.Web.IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property

    Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
            If FileInvalid Then // Maybe want to check the path is valid, or they are authorised to see it, etc.
                context.Response.StatusCode = 404
                context.Response.StatusDescription = "404 Not Found"
                context.Response.Flush()
            Else
                context.Response.ContentType = "application/pdf"
                context.Response.AddHeader("Content-Disposition", "attachment; filename=MyPDF.pdf")

                context.Response.BinaryWrite(PDFBinaryContent) // E.g. Loaded from a database, disk, etc                
            End If
    End Sub
End Class

Наконец, просто сконфигурируйте IIS для передачи запросов на .pdf в движок .NET (не забудьте отключить «Проверка наличия файла», если это необходимо. И этодолжен это сделать.

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