Загрузка файла 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>
Другие вопросы по тегам