Подтвердить что ты не робот

Как загрузить файл с сервера с помощью jQuery AJAX и Spring MVC 3

Я хочу реализовать загрузку (с AJAX) загруженного файла с сервера. На стороне сервера я написал код

@RequestMapping(value = "/getInvoice/approvalId/{approvalId}", method = RequestMethod.GET)
public
@ResponseBody
byte[] getInvoice(@PathVariable("approvalId") Integer approvalId, HttpServletResponse response) throws IOException {
    String fileName = this.approvalService.getFullInvoicePath(approvalId);
    File file = new File(fileName);

    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
    response.setHeader("Pragma", "no-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setContentLength((int) file.length());
    return FileUtils.readFileToByteArray(file);
}

Fiddler2 показывает ответ:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Disposition: attachment; filename="invoice.pdf"
Pragma: no-cache
Cache-Control: no-cache
Content-Type: application/octet-stream;charset=UTF-8
Content-Length: 1028351
Date: Sun, 17 Jul 2011 08:16:41 GMT

%PDF-1.4
%����
6 0 obj <</Linearized 1/L 1028351/O 8/E 1024254/N 1/T 1028185/H [ 5056 544]>>
endobj

xref
6 238 
*** FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation. ***

Как обработать и заставить браузер загружать файл с помощью jQuery?

4b9b3361

Ответ 1

Обычно используются два варианта, но ни один из них не включает Ajax. И jQuery тоже не поможет:

Вариант 1: IFrame

Поместите невидимый IFrame на свою страницу:

<iframe id="downloadFrame" style="display:none"></iframe>

Когда загрузка начнется (вы не указали, как она запускается), используйте Javascript (и, возможно, jQuery), чтобы установить URL-адрес IFrame, что в вашем случае выглядит как /getInvoice/approvalId/123:

var iframe = document.getElementById("downloadFrame");
iframe .src = "/getInvoice/approvalId/123";

Установка URL-адреса IFrame должна инициировать браузер для представления диалогового окна загрузки.

Вариант 2. Перейдите к URL-адресу загрузки

Второй вариант еще проще. Просто перейдите к URL-адресу загрузки. После того, как браузер отобразит его тип MIME, который не может быть отображен, он представит диалог загрузки.

Поэтому, когда загрузка запускается, выполните следующий код Javascript:

window.location.href = "/getInvoice/approvalId/123";

Примечание:

Я не уверен, что все браузеры будут надежно представлять диалог загрузки с файлами PDF. Некоторые браузеры могут попытаться отобразить их в самом браузере. Заголовок контента полезен, но не гарантирует.

Ответ 2

jQuery-ized ответ Codo:

   $('#downloadFrame').remove(); // This shouldn't fail if frame doesn't exist
   $('body').append('<iframe id="downloadFrame" style="display:none"></iframe>');
   $('#downloadFrame').attr('src','/downloadUrlGoesHere');

Ответ 3

Возможно, лучшей стратегией будет использование jQuery для создания нового <A> ссылку на страницу, которая будет ссылаться на этот же URL-адрес, и вставить этот новый элемент в соответствующее место в DOM. Это делается, возможно, jQuery может даже щелкнуть его для пользователя, инициировав загрузку.