当isUpload为true时,从不调用Ext.Ajax.request回调

Ama*_*s45 2 javascript ajax extjs

我正在使用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
});
Run Code Online (Sandbox Code Playgroud)

关联的php文件简单输出CSV字符串,工作文件.

由于isUpload为true,似乎回调永远不会返回给用户.一旦我删除它,就会调用回调,但文件不会上传到客户端.

现在的问题是,一切都运行良好,但MessageBox永远不会消失,因为永远不会调用回调(成功,失败或回调)

任何的想法 ?:P

附加信息:

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");
Run Code Online (Sandbox Code Playgroud)

The*_*evs 7

这是Ext.Ajax.request文档的摘录:

isUpload:Boolean(可选)如果表单对象是文件上载(通常会自动检测到),则为True.不使用普通的"Ajax"技术执行文件上载,即不使用XMLHttpRequests执行它们.而是以标准方式提交表单,其中DOM元素被临时修改以使其目标设置为引用动态生成的隐藏,其被插入到文档中但在收集返回数据之后被移除.浏览器解析服务器响应以创建IFRAME的文档.如果服务器使用JSON发送返回对象,则必须将Content-Type标头设置为"text/html",以告知浏览器将文本未更改地插入到文档正文中.从文档中检索响应文本,并创建包含responseText属性的伪XMLHttpRequest对象,以符合事件处理程序和回调的要求.请注意,文件上载数据包与内容类型multipart/form一起发送,并且某些服务器技术(特别是Java EE)可能需要一些自定义处理才能从数据包内容中检索参数名称和参数值.

如您所见,上传请求是通过IFRAME返回的,只模拟标准的AJAX响应,因此不会调用回调.