Как открыть файл с помощью JavaScript? - PullRequest
7 голосов
/ 17 апреля 2009

У меня есть сервлет, который записывает файл PDF в виде ByteArrayOutputStream в выходной поток сервлета. Если я открою URL сервлета, браузер откроет файл. Но если в сервлете происходит ошибка, браузер открывает пустой файл PDF с сообщением об ошибке. Отправляя ошибку через ServletResponse, браузер открывает страницу ошибки по умолчанию.

Я хочу отправить сообщение об ошибке без перенаправления на страницу ошибки или открытия неверного файла PDF.

Я пытался:

new Ajax.Request('/pdfservlet', {            
        onSuccess: function(response) {
            docWindow = window.open('','title');
            docWindow.document.open('application/pdf');
            docWindow.document.write(response);
            docWindow.document.close();
        },
        onFailure: function(response) {
            alert(response);
        }
    });

Но onSuccess открывает страницу с [объект объекта]

Как открыть файл PDF с помощью JavaScript?

Ответы [ 4 ]

10 голосов
/ 17 апреля 2009

Примечание. Я предполагаю, что вы используете платформу Prototype из Ajax.Request вызова.

Объект ответа не предназначен для прямой записи, однако имеет свойство responseText, которое должно содержать возвращенный PDF.

Вы пробовали:

new Ajax.Request('/pdfservlet', {            
        onSuccess: function(response) {
            docWindow = window.open('','title');
            docWindow.document.open('application/pdf');
            document.write(response.responseText);
            docWindow.document.close();
        },
        onFailure: function(response) {
            alert(response);
        }
    });

(обратите внимание на добавленное .responseText)

Редактировать: Хорошо, это не сработало ... Попробуйте что-то вроде этого:

new Ajax.Request('/pdfservlet', {            
        onSuccess: function(response) {
            window.open('/pdfservlet');
        },
        onFailure: function(response) {
            alert(response);
        }
    });

Что это будет делать, это создать запрос ajax и, в случае успеха, открыть его в новом окне. Открытие нового окна должно быть быстрым и фактически не требовать повторного запроса PDF, поскольку браузер должен был кэшировать его во время вызова Ajax.Request.

2 голосов
/ 17 апреля 2009

Вы можете попробовать подход с двумя проходами. Вы используете Ajax для вызова сервлета (и если он генерирует PDF на лету, пусть он его кеширует). Если это удастся, перенаправьте пользователя на сервлет с параметром для загрузки кэшированного PDF.

Существуют и другие варианты, но это зависит от того, как вы используете PDF-файлы.

Мои $ 0,02 ..

0 голосов
/ 18 апреля 2009

Но если в сервлете возникает ошибка, браузер открывает пустой файл PDF с сообщением об ошибке.

Мне кажется, было бы лучше попытаться исправить это на стороне сервера, чем вся эта хрупкая работа с AJAX и кешами. Почему ошибка сервлета все еще устанавливает заголовок «Content-Type: application / pdf» с его сообщением об ошибке? Проверьте порядок отправки вещей в сервлете; не отправляйте «Content-Type» до тех пор, пока вы не создадите PDF-файл успешно и не готовы вернуть его.

0 голосов
/ 17 апреля 2009

Поскольку кажется, что вы отправляете свои PDF-файлы как «встроенные», а не «вложения», вы можете поместить URL-адрес PDF-файла в динамически созданный Iframe, а затем прикрепить этот Iframe к наложению. Это будет работать.

-JP

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