Как через ajax запустить php, генерирующий файл?

Есть форма с jquery, которая генерирует word-овский файл исходя из значений полей. Её описание:



<form id="vform" name="vform" method="post" action="/generate.php">




generate.php создает файл и передает его пользователю такими заголовками:



header('X-Accel-Redirect: ' . $shortfilename);<br>
header('Content-Type: application/octet-stream');<br>
header('Content-Disposition: attachment; filename=' . basename($shortfilename));


Таким образом файл генерируется, появляется диалог сохранения, форма не перегружается.



Всё работает ок, только вот хочется сделать disable кнопке на время генерации файла и вывести какое-то сообщение в конце.

Я ничего лучше не придумал кроме как отслеживать submit формы и запускать php файл через ajax. Но тут не очень понятно — как сделать сохранение? вместо responce у меня выходит исходный код word-файла.

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



Пожалуйста, подскажите, как быть.
  • Вопрос задан
  • 8838 просмотров
Пригласить эксперта
Ответы на вопрос 5
fear86
@fear86
Developer
1 — Отправить ajax запрос
2 — Дождаться ответа с ссылкой
3 — Открыть ссылку в iframe
4 — PROFIT!
Ответ написан
@Vampiro
Учитывая, что у вас уже есть приличная готовая часть и ее нет смысла переделывать, я бы реализовал это так:
1. Добавляю в форму некий UID (rand)
2. onSubmit, кроме отправки формы к generate.php я дизаблю контролы и отправляю на сервер ajax запрос с этим UID (/generationcheck.php?uid=....) в коллбеке — разлочивание контролов.
3. в generate.php я добавляю в самое начало коннект к мемкешу (допустим) и в него ставлю отметку, что начал генерить файл с UID=$_POST['UID']. после генерации, я отмечаю в мемкеше, что все сделано (например, меняю значение с 0 на 1)
4 файл generationcheck.php подключается к мемкешу, проверяет, что файл еще генерится и засыпает в цикле while на секунду. Как только при очередной проверке замечено, что файл сгенерился — удаляем переменную из мемкеша и отправляем респонс клиенту, чтобы раздизаблить контролы на форме. Ну и аварийный выход через 60 циклов, на случай если генерация файла с ошибкой произошла.

Как-то так, если не хочется ифреймы воротить. Потом можно будет сделать просмотр — какие именно файлы сейчас генерятся на серваке при желании. Но у вас на одного клиента будут висеть два открытых коннекта, что не есть гуд.
Ответ написан
Комментировать
Slavenin999
@Slavenin999
программист php/erlang/elixir/js
все проще,
создаем iframe, сабмитим форму в него,
блокируем кнопки,
на событие загрузки фрейма вешаем обработчик,
как-только окно загрузилось значит можно разблокировать контролы убрать iframe
Ответ написан
Комментировать
nazarpc
@nazarpc
Open Source enthusiast
А если реагировать на mousedown?
Тогда сработает до отправки формы.
На счёт данных — попробуйте создать ссылку c url вида «data:...» (wiki) и кликайте по ней с помощью jQuery, если файл не очень большой — будет работать.
Ответ написан
dpigo
@dpigo
Front-end developer
В jquery к вашим услугам целый набор событий для работы с аяксом, с помощью которых вы можете отслеживать состояние выполнения запроса и в зависимости от этого модифицировать элементы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы