Загрузка файла Grails не начинается при вызове из remoteFunction
В моем приложении Grails пользователь может нажать на g:link
который вызовет мой контроллер для экспорта определенных данных в файл CSV. Это работает без проблем.
Затем я переместил эту кнопку в диалоговое окно jQuery и, когда кнопка нажата, я использую
${remoteFunction(action:'export', onSuccess:'closeMe();', id:courseInstance?.id)}
вызвать тот же метод контроллера и закрыть диалоговое окно. Я подтвердил, что метод действительно вызывается, и диалоговое окно закрывается. Однако пользователю не предлагается загрузить файл CSV. Я предполагаю, что это как-то связано с удаленной функцией, но я не совсем уверен. Может кто-нибудь объяснить, почему это может произойти, и потенциальное решение?
Спасибо!
1 ответ
С AJAX-запросами вы не можете обрабатывать загрузку контента в виде вложений, поэтому он не может вызвать диалоговое окно "Сохранить как".
Есть несколько обходных путей для этого:
- Используйте обычную ссылку g: как и раньше и свяжите 'closeMe();' функция к событию "клик". Проблема в том, что у вас нет контроля над ошибкой или успешным ответом.
- Используйте iframe: вы можете создать временный невидимый iframe и установить его местоположение по URL-адресу файла для загрузки. Он также имеет обратную сторону - не контролирует реакцию на успех / ошибку.
Код может быть таким же, как в этом ответе:
<script type="text/javascript">
function downloadURL(url) {
var iframe;
var hiddenIFrameID = 'hiddenDownloader';
iframe = document.getElementById(hiddenIFrameID);
if (iframe === null) {
iframe = document.createElement('iframe');
iframe.id = hiddenIFrameID;
iframe.style.display = 'none';
document.body.appendChild(iframe);
}
iframe.src = url;
}
</script>
И ссылка
<a href="javascript:downloadURL(${createLink(action:'export')})">Export</a>