[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Отдача файла после вынужденной задержки
DorianLeroy
Добрый день, уважаемые форумчане.
Проблема следующая:

Юзеру после нажатия кнопки "Получить" по SOAP приходит файл в виде закодированной base64 строки.

Как я реализовал:
После нажатия кнопки "Получить" открывается новое окно с помощью JS, в котором происходит запрос с серверу. Запрос длится достаточно долго (секунд 5-10). После чего, если запрос прошел удачно, я декодирую строку, и отправляю заголовки
@header("Content-Type: application/pdf");
@header("Content-disposition: attachment; filename=downloaded.pdf");

и юзер получает долгожданный файл.
Что мне не нравится в данный момент, так это то, что по время запроса висит пустое бланковое окно, в котором я не могу даже написать "LOADING...", поскольку далее придется слать заголовки. Юзер далеко не всегда понимает в чем дело, и частенько закрывает это окно, подумав, что произошла ошибка, не дождавшись файла.

Собственно в этом и есть проблема.
Guest
Код какой отправки?
DorianLeroy
Какой код какой отправки?
Guest
JS код запроса. Если ajax то есть методы success в нём останавливать анимацию, перед запросом включать анимацию.
DorianLeroy
Ок, сначала я объясню почему я не использую сейчас ajax.
Вот как я представляю рабочую схему с ajax: после того как от клиента ушел запрос на сервер в обработчик (get_file.php), get_file.php в свою очередь отсылает запрос по soap удаленному серверу, потом приходит ответ от сервера, get_file.php раскодировал строку и получил файл, и вот после этого мне нужно послать этот файл юзеру, но не могу (или не знаю как правильно) послать заголовки
@header("Content-Type: application/pdf");
@header("Content-disposition: attachment; filename=downloaded.pdf");


Поэтому сейчас использую следующий JS:

function get_file(){
//init data
var number,tr;
tr = $j(obj).closest("tr");
number = $j(".number",tr).text();
// #init

//open new window

saveWin = window.open('/loading_page.html','blank','top='+0+', left='+0+', height='+(screen.availWidth - 50)+',width='+(screen.availHeight - 50)+',status=no,toolbar=no,menubar=no,location=no, resizable=yes, scrollbars=yes');
//href location
saveWin.location.href = './iframes/file.php?&number='+number;

saveWin.focus;
}



inpost
Если так и дальше будешь продолжать лепить собак, поток пол года будешь пытаться понять, почему твой скрипт не работает так, как ты хочешь.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
DorianLeroy
Вобщем если кому-то интересно или кто-то сможет внести конструктивную критику, я сделал так:

От клиента ajax'ом отправил запрос в get_file.php. get_file.php принял файл от удаленного сервера, и сохранил его во временную директорию. Если файл нормально сохранился, то отсылаем клиенту об этом инфу или ошибку в противном случае.

На стороне клиента, в методе, вызываемом после удачного выполнения ajax запроса, загружаю временный файл через скрытый фрейм.
sergeiss
Если что-то долго обрабатывается, то кто ж тебе мешает ПЕРЕД отправкой запроса повесить информацию с извинениями о том, что идет загрузка файла и процесс может занять некоторое время? Можно даже вывести индикатор уже затраченого времени, чтобы юзер видел, что скрипт живой.

Второй вариант - отправить запрос на выкачивание файла и отключиться от сервера. Пусть он качает... И периодически запрашивать: скачался или нет? Как только скачался, то сформировать ссылку для загрузки уже со своего сервера, уже с использованием тех заголовков, что ты показала в самом начале.
Опять же, тут никто и ничто не мешает тебе показывать индикатор загрузки.

При желании можно еще альтернатив придумать, с разными вариациями smile.gif

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.