Ext.Ajax.request обратные вызовы никогда не вызывались, когда isUpload имеет значение - PullRequest
2 голосов
/ 14 июля 2009

Я использую ExtJS для создания формы, которая генерирует отчет из данных в базе данных в формате CSV. После того, как пользователь выберет простой диапазон дат для извлечения данных и отправит, запустив следующий код:

var frm = document.createElement('form');
frm.id = 'frmDummy';
frm.name = id;
document.body.appendChild(frm);

Ext.MessageBox.wait('Generating CSV File ...');

Ext.Ajax.request({
    url: 'csv_extract_ajax.php?start_time='+txtDateFieldFrom.getRawValue()+'&end_time='+txtDateFieldTo.getRawValue(),

    method : 'POST',

    form: Ext.fly('frmDummy'),

    isUpload: true, 

    success: function(o, r, n){

        Ext.MessageBox.updateProgress(1);
        Ext.MessageBox.hide();
    },

    failure: function(o, r, n){

        Ext.MessageBox.updateProgress(1);
        Ext.MessageBox.hide();
    },

    callback: function(o, r, n){

        Ext.MessageBox.updateProgress(1);
        Ext.MessageBox.hide();
    },     

    scope: this
});

Связанный файл php просто выводит строку CSV, рабочий файл.

Поскольку isUpload имеет значение true, кажется, что обратный вызов никогда не возвращается пользователю. Как только я удаляю его, вызывается обратный вызов, но файл не загружается на клиент.

Проблема сейчас, все работает отлично, но MessageBox никогда не исчезает, так как обратные вызовы никогда не вызываются (успех, сбой или обратный вызов)

Есть идеи? : Р

Дополнительная информация:

Заголовок PHP:

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: private");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=$filename");
header("Accept-Ranges: bytes");

Ответы [ 6 ]

7 голосов
/ 20 июля 2009

Это выдержка из Ext.Ajax.request документации:

isUpload: Boolean (Необязательно) True, если объект формы представляет собой файл загрузки (будет обычно определяется автоматически). Загрузка файлов не выполняется с помощью нормальные техники "Аякса", то есть они не выполняются с использованием XMLHttpRequest работают. Вместо этого форма представлены в стандартном порядке с элемент DOM временно изменен, чтобы его цель была установлена ​​в ссылаются на динамически генерируемые, скрытый, который вставляется в документ, но удален после возвращенные данные были собраны. ответ сервера анализируется браузер для создания документа для IFRAME. Если сервер использует JSON для отправить возвращаемый объект, затем Заголовок Content-Type должен быть установлен в "text / html", чтобы сообщить браузер для вставки текста без изменений в тело документа. Ответ текст извлекается из документа, и поддельный объект XMLHttpRequest созданный содержащий responseText собственность, чтобы соответствовать требования к обработчикам событий и Обратные вызовы. Помните, что загрузка файла пакеты отправляются с типом контента multipart / форма и некоторый сервер технологии (особенно Java EE) могут потребовать некоторая пользовательская обработка для того, чтобы получить имена параметров и параметров значения из содержимого пакета.

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

1 голос
/ 17 июля 2009

Как только я уберу его, ответный звонок вызывается, но файл не загружен клиенту.

Установка isUpload в true означает, что вы собираетесь загружать файл с клиента на сервер, но, боюсь, это не ваш случай.

1 голос
/ 15 июля 2009

Есть ли какая-либо ошибка, отображаемая на странице?

Что такое тип ответа? В extjs api doc указано, что для него должно быть установлено значение «text / html».

Если он все еще не работает, вы можете попробовать установить точку останова в doFormUpload (). Этот метод присутствует в файле connection.js. Внутри этого вы можете найти внутренний метод с именем cb (), этот метод будет вызван, когда сервер вернется. Оттуда можно начать отладку.

всего наилучшего.

1 голос
/ 14 июля 2009

Попробуйте изменить:

l: 'csv_extract_ajax.php? Start_time =' + txtDateFieldFrom.getRawValue () + '& end_time =' + txtDateFieldTo.getRawValue (),

до

l: 'csv_extract_ajax.php?' + Ext.urlEncode ({start_time: txtDateFieldFrom.getRawValue (), end_time: txtDateFieldTo.getRawValue ()}),

0 голосов
/ 17 июля 2009

Если у вас нет файла для загрузки, почему вы устанавливаете isUpload в true?

Кроме того, если вы публикуете данные в сценарии PHP и этот сценарий возвращает строку CSV, почему вы пытаетесь отправить их как вложение? Почему бы не отправить его как обычный текст ответа?

0 голосов
/ 14 июля 2009

Вы заметили это в каждом браузере или просто в определенном браузере?

Firefox 3.5 (с установленным Firebug), по-видимому, имеет ошибку , что означает, что readystatechange не обновляется, что означает, что обратные вызовы не запускаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...