У мене є сторінка, яка дозволяє користувачеві завантажувати динамічно генерований файл. Генерування потрібно тривалий час, тому я хотів би показати індикатор "очікування". Проблема полягає в тому, що я не можу зрозуміти, як виявити, коли браузер отримав файл, тому я можу приховати індикатор.
Я роблю запит у прихованій формі, яка надсилає POST на сервер, і націлює прихований кадр для його результатів. Це так, що я не замінюю все вікно браузера результатом. Я слухаю подію "завантаження" на iframe, сподіваючись, що вона запуститься, коли завантаження завершиться.
Я повертаю заголовок "Вміст-диспозиція: вкладення" з файлом, через який браузер відображає діалогове вікно "Зберегти". Але браузер не запускає події "завантаження" в iframe.
Один із підходів, який я спробував, - це використання багаточастинкової відповіді. Так він надішле порожній HTML-файл, а також доданий файл, який можна завантажити. Наприклад:
Content-type: multipart/x-mixed-replace;boundary="abcde"
--abcde
Content-type: text/html
--abcde
Content-type: application/vnd.fdf
Content-Disposition: attachment; filename=foo.fdf
file-content
--abcde
Це працює у Firefox; він отримує порожній HTML-файл, запускає подію "load", потім показує діалогове вікно "Зберегти" для завантажуваного файлу. Але це не вдається на IE і Safari; IE запускає подію "load", але не завантажує файл, а Safari завантажує файл (з неправильним ім'ям та типом вмісту) та не запускає подію "load".
Іншим підходом може бути заклик розпочати створення файлу, а потім опитувати сервер до готовності, а потім завантажити вже створений файл. Але я краще уникати створення тимчасових файлів на сервері.
Хтось має кращу ідею?