2013-05-31 3 views
0

У меня есть веб-приложение, которое позволяет пользователю загружать файл изображения с сервера. Когда пользователь нажимает кнопку на странице jsp, создается запрос ajax post, который выполняет сервлет и в ответ отправляет файл изображения. Но проблема в том, что файл изображения никогда не загружается, а диалоговое окно «Сохранить как» не подходит.Диалог загрузки файла сервлета Java не отображается

В Firebug я вижу, что запрос отправлен правильно и ответ получен с правильным кодом типа Contect и кодом состояния 200. Я также вижу двоичные данные на вкладке Response Response, но по какой-то причине изображение не загружается. Помощь Pls.

Запрос: * URL запроса: http://localhost:8080/SVGToImage/convertToImg

Запрос Метод: POST

Код состояния: 200 OK *

Ответ:

* Content-Disposition: имя файла = "out.jpg"

Content-Type: изображение/JPEG

Дата: Пт, 31 мая 2013 17:28:26 GMT

Сервер: Apache-Coyote/1,1

Transfer-Encoding: фрагментированное *

Вот мой JSP

<head> 

<script> 

    function exportToImage(){ 

    var svg = document.getElementById("ext-gen1040");  

    var svg1 = new XMLSerializer().serializeToString(svg); 

     jQuery.noConflict(); 

     jQuery.ajax({ 
      url: "convertToImg" , 
      type: "POST", 
        data: { q = svg1}, 
      success: function(data) {    
      }, 
      error: function(jqXHR, textStatus, errorThrown) { 
       alert('Error ' + textStatus); 
      }  
}); 

</script> 

</head> 

<body> 
<input type="button" value="export" onclick="javascript:exportToImage();"> 
</body> 

На стороне сервера здесь код сервлета:

private void doPost(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 

    String filePath = "C:/Users/nandan.jain/Pictures/out.jpg"; 
    File file = new File(filePath); 
    int length = 0; 
    ServletOutputStream outStream = response.getOutputStream(); 

    response.setContentType("image/jpeg"); 
    response.setContentLength((int)file.length()); 
    String fileName = (new File(filePath)).getName(); 

    // sets HTTP header 
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); 

    byte[] byteBuffer = new byte[BUFSIZE]; 
    DataInputStream in = new DataInputStream(new FileInputStream(file)); 

    // reads the file's bytes and writes them to the response stream 
    while ((in != null) && ((length = in.read(byteBuffer)) != -1)) 
    { 
     outStream.write(byteBuffer,0,length); 
    } 

    in.close(); 
    outStream.close(); 


} 

Благодаря

ответ

2

Вы не можете скачивать файлы с помощью AJAX. Ajax выполняется по языку JavaScript. Язык JavaScript по очевидным соображениям безопасности не имеет возможности программно запускать диалог Save As и предоставлять произвольное содержимое файла.

Просто скачайте его по запросу, отличному от ajax. Если заголовок Content-Disposition установлен на attachment, текущая страница останется неизменной в любом случае.

Таким образом, вместо того, что весь jQuery.ajax() вещь, вы можете просто сделать

window.location = "convertToImg?q=" + encodeURIComponent(svg1); 

и выполнять работу в сервлета doGet() вместо этого.

Или, если вам действительно нужен POST, тогда сделайте его обычной формой отправки.

<form action="convertToImg" method="post"> 
    <input type="hidden" name="svg1" /> 
    <input type="submit" onclick="exportToImage(this)" /> 
</form> 

с

function exportToImage(button) { 
    var svg = document.getElementById("ext-gen1040");  
    var svg1 = new XMLSerializer().serializeToString(svg); 
    button.form.svg1.value = svg1; 
} 

Пожалуйста, обратите внимание, что конкретная проблема не имеет никакого отношения к JSP/сервлеты.

+0

Hi BalusC, Спасибо за объяснение. Я внес изменения в соответствии с вашими предложениями, и это сработало хорошо. Спасибо, что помогли мне и очень быстро ответили. – always

+0

Добро пожаловать. – BalusC

+0

@BalusC Я понимаю, что это сообщение с прошлого года, но это помогло мне узнать, что вы не можете скачивать файлы с помощью ajax. Поэтому у меня есть форма, которая передается сервлету (а не через ajax), который создает файл и отправляет его в браузер для загрузки пользователем. Я хочу показать загрузочное изображение, пока этот сервлет работает, потому что он занимает много времени. Как я могу показать загрузочное изображение во время этой обработки сервлета, если я не использую ajax для отправки формы? – Lani1234

Смежные вопросы