У мене є веб-сторінка на одній сторінці jQery. Він спілкується з веб-службою RESTful через дзвінки AJAX.
Я намагаюся досягти наступного:
- Надішліть POST, що містить дані JSON, на адресу REST.
- Якщо запит визначає відповідь JSON, тоді JSON повертається.
- Якщо запит вказує відповідь PDF / XLS / тощо, то повертається завантажуваний двійковий файл.
У мене зараз працюють 1 і 2, і програма jquery клієнта відображає повернуті дані на веб-сторінці, створюючи елементи DOM на основі даних JSON. У мене також №3 працює з точки зору веб-сервісу, тобто він створить і поверне двійковий файл, якщо задати правильні параметри JSON. Але я не впевнений, що найкращий спосіб впоратися з №3 в коді JavaScript клієнта.
Чи можливо повернути завантажений файл із виклику Ajax, як це? Як змусити браузер завантажити та зберегти файл?
$.ajax({
type: "POST",
url: "/services/test",
contentType: "application/json",
data: JSON.stringify({category: 42, sort: 3, type: "pdf"}),
dataType: "json",
success: function(json, status){
if (status != "success") {
log("Error loading data");
return;
}
log("Data loaded!");
},
error: function(result, status, err) {
log("Error loading data");
return;
}
});
Сервер відповідає наступними заголовками:
Content-Disposition:attachment; filename=export-1282022272283.pdf
Content-Length:5120
Content-Type:application/pdf
Server:Jetty(6.1.11)
Інша ідея - генерувати PDF та зберігати його на сервері та повертати JSON, що включає URL у файл. Потім надішліть черговий дзвінок у обробці успіху ajax, щоб зробити щось на зразок наступного:
success: function(json,status) {
window.location.href = json.url;
}
Але це означає, що мені потрібно буде зробити більше, ніж один дзвінок на сервер, і мій сервер повинен будувати файли, що завантажуються, зберігати їх десь, а потім періодично очищати цю область зберігання.
Має бути простіший спосіб досягти цього. Ідеї?
EDIT: Переглянувши документи на $ .ajax, я бачу, що тип даних відповіді може бути лише одним xml, html, script, json, jsonp, text
, тому я здогадуюсь, що немає способу безпосередньо завантажити файл за допомогою запиту ajax, якщо я не вбудую двійковий файл у використанні Схема URI даних, як це запропоновано у відповіді @VinayC (що я не хочу робити).
Тому я думаю, що мої варіанти такі:
Не використовувати ajax, а надіслати публікацію форми та вбудувати мої дані JSON у формулярні значення. Ймовірно, потрібно було б возитися із прихованими рамками кадрів та ін.
Не використовувати ajax, а замість цього перетворити мої дані JSON у рядок запиту, щоб створити стандартний GET-запит та встановити window.location.href у цю URL-адресу. Можливо, потрібно використовувати event.preventDefault () у моєму обробці кліків, щоб браузер не змінювався від URL-адреси програми.
Скористайтеся моєю іншою ідеєю вище, але доповнено пропозиціями з відповіді @naikus. Надішліть запит AJAX з деяким параметром, який дозволяє веб-сервісу знати, що це викликається через дзвінок ajax. Якщо веб-служба викликається з виклику ajax, просто поверніть JSON з URL-адресою на створений ресурс. Якщо ресурс викликається безпосередньо, поверніть фактичний бінарний файл.
Чим більше я думаю про це, тим більше мені подобається останній варіант. Таким чином я можу отримати інформацію про запит (час для генерації, розмір файлу, повідомлення про помилки тощо), і я можу діяти на цій інформації перед початком завантаження. Мінусом є додаткове управління файлами на сервері.
Будь-які інші способи досягти цього? Які плюси / мінуси цих методів я повинен знати?
url = 'http://localhost/file.php?file='+ $('input').val(); window.open(url);
Простий спосіб отримати однакові результати. Помістіть заголовок у файл php. Не потрібно надсилати жодних