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

时间:2009-07-14 03:35:16

标签: 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
});

关联的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");

6 个答案:

答案 0 :(得分:7)

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

  

isUpload:Boolean(可选)如果是,则为True   表单对象是文件上传(将   通常会自动检测到)。   不使用执行文件上传   正常的“Ajax”技术,就是他们   没有使用   XMLHttpRequest的。相反,形式是   以标准方式提交   DOM元素暂时   修改为将其目标设置为   指动态生成的,   隐藏的插入   该文件但在删除后删除   已经收集了返回数据。该   服务器响应由。解析   浏览器为其创建文档   IFRAME。如果服务器正在使用JSON   发送返回对象,然后发送   Content-Type标头必须设置为   “text / html”为了告诉你   浏览器插入文本不变   进入文件正文。响应   从文档中检索文本,   和一个假的XMLHttpRequest对象是   创建包含responseText   财产以符合   事件处理程序的要求和   回调。请注意文件上传   数据包与内容类型一起发送   multipart / form和一些服务器   技术(尤其是Java EE)可能需要   一些自定义处理以便   检索参数名称和参数   数据包内容的值。

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

答案 1 :(得分:1)

尝试更改:

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

答案 2 :(得分:1)

页面中是否显示错误?

回复的内容类型是什么? extjs api doc说它应该设置为“text / html”。

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

一切顺利。

答案 3 :(得分:1)

  

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

isUpload设置为true意味着您要将文件从客户端上传到服务器,但这不是您的情况,我担心。

答案 4 :(得分:0)

您是否在每个浏览器中或仅在特定浏览器中注意到这一点?

Firefox 3.5(安装了Firebug)似乎有a bug,这意味着readystatechange不会更新,这意味着不会调用回调。

答案 5 :(得分:0)

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

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