Потоковая передача PDF через вызов HTTPHandler с использованием $ .get в элемент объекта - PullRequest
0 голосов
/ 17 мая 2010

То, что я пытаюсь сделать, это вызвать HTTPHandler через метод jQuery $ .get, который отправит обратно PDF-файл и отобразит его на веб-странице, используя элемент object. Мой предыдущий метод установки атрибута src IFrame в качестве результата вызова обработчика работает, но я хотел бы получить уведомление о завершении через браузер, поэтому перешел к использованию $ .get (). Пример кода:

    function buttonClick() {

        $.get("/PDFHandler.ashx", {},

            function(data, textStatus, XMLHttpRequest) {
                var pdfObjectString = "<object data='' type='application/pdf' width='600' height='600'></object>";
                var pdfObject = $(pdfObjectString);
                pdfObject.attr("data", data);
                $("#container").append(pdfObject);
            });

Как видите, я пытаюсь вставить переменную 'data' в элемент объекта. Это не работает (без ошибок, PDF просто не отображается), возможно потому, что возвращаемые данные являются двоичными, а метод attr () ожидает строку (я думаю).

У меня такой вопрос: как я могу вызвать HTTPHandler через $ .get и каким-то образом присвоить данные обратного вызова атрибуту данных объекта?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2014

Я часами боролся за то, чтобы что-то вроде этой работы, и это было мое очень простое решение, которое отлично работает:

  1. На стороне браузера у меня есть iFrame, содержащийся в теге DIV, но может быть где угодно. Вы можете изменить атрибуты iFrame, чтобы скрыть / показать их по мере необходимости.

<div id = "divpayframe">
<iframe name="payframe" id="payframe" width="600" height="800" frameborder="0"></iframe>
</div>
  1. У меня также есть форма, которая использует обычную отправку на сервер, но указывает цель как iFrame.

<form id="frmpayslip" method="post" action="/payslip" target="payframe">
  1. Сервер возвращает поток PDF и устанавливает тип содержимого ответа на application / pdf. Смотрите ниже код (написанный на Delphi)

    Var S: TMemoryStream;

    // Некоторый код генерирует файл PDF на стороне сервера и преобразует его в поток файла PDF // Назначаем поток переменной S и устанавливаем Response для возврата потока

    Response.ContentType: = 'application / pdf'; Response.SendStream (S);

Обратите внимание, что для этого не требуются пользовательские заголовки, если вы не хотите вместо этого отправлять их как вложение, в этом случае вы можете отправить 'Content-Disposition', 'attachment; filename = "payslip.pdf" 'для достижения того же результата.

0 голосов
/ 19 мая 2010

На основании этого вопроса: Как открыть файл с помощью JavaScript? Мне удалось найти решение. По сути, вы снова вызываете обработчик в функции обратного вызова success. Я не мог заставить его работать с тегом <object> (все еще используя IFrame), но он достаточно хорош для того, что мне нужно.

Чтобы это работало, обработчик HTTP должен кэшировать результаты, в противном случае он просто снова вызывается.

...