我正在使用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");
答案 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字符串,您为什么要尝试将其作为附件发送?为什么不把它作为常规回复文本发送?