Как скачать файл с сервера, используя jQuery AJAX и Spring MVC 3 - PullRequest
13 голосов
/ 17 июля 2011

Я хочу осуществить загрузку (с 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?

Ответы [ 3 ]

33 голосов
/ 17 июля 2011

Обычно используются два варианта, но ни один из них не включает 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 загрузки

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

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

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

Примечание:

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

4 голосов
/ 18 января 2015

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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...