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

Javascript isUpload为true时从不调用Ext.Ajax.request回调,javascript,ajax,extjs,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({

我使用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文件simple输出一个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");

您是在每个浏览器中都注意到了这一点,还是只在特定的浏览器中注意到了这一点

Firefox 3.5(安装了Firebug)似乎具有这一特性,这意味着readystatechange不会得到更新,这意味着回调不会被调用。

尝试更改:

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()}),

页面中是否显示任何错误

响应的内容类型是什么? ExtJSAPI文档说它应该设置为“text/html”

如果它仍然不工作,您可以尝试在doFormUpload()中设置断点。此方法出现在connection.js中。在其中,您可以找到一个名为cb()的内部方法,一旦服务器返回,就会调用该方法。您可以从那里开始调试

祝你一切顺利

一旦我删除它,回调 调用,但未上载文件 给客户


isUpload
设置为true意味着您要将文件从客户端上载到服务器,但恐怕这不是您的情况

如果您没有要上载的文件,为什么要将isUpload设置为true


另外,如果您将数据发布到PHP脚本,并且该脚本返回CSV字符串,那么为什么要尝试将其作为附件发送?为什么不将其作为常规响应文本发送?

这是从
Ext.Ajax.请求文件中摘录的内容:

isUpload:Boolean(可选)如果为True 表单对象是一个文件上载(将 通常会自动检测到)。 文件上载不使用执行 正常的“Ajax”技术,也就是说 不使用 XMLHttpRequests。相反,表格是 以标准方式提交 暂时删除DOM元素 修改为将其目标设置为 指动态生成的, 隐藏,插入到 文档,但在 已收集返回数据。这个 服务器响应由 使用浏览器为文档创建文档 IFRAME。如果服务器正在使用JSON来 发送返回对象,然后发送 内容类型标题必须设置为 “text/html”以告知 在浏览器中插入未更改的文本 进入文档体。反应 从文档中检索文本, 一个假的XMLHttpRequest对象是 已创建包含responseText的 属性,以符合 事件处理程序和 回调。请注意,文件上载 数据包以内容类型发送 多部分/表单和一些服务器 技术(尤其是JavaEE)可能需要 一些自定义处理,以便 检索参数名称和参数 数据包内容中的值


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

我用Chrome尝试过同样的方法,所以不是这样。无论如何,谢谢:)PHP没有问题,isUpload似乎会终止回调。我也试过同样的方法。无论如何谢谢:)没有错。。。我会继续调查的,谢谢你的帮助+1.