我想制作一个csv文件,让用户通过单击按钮下载它。有一个表单可以搜索用户(带有一些搜索字段(和按钮搜索:这是搜索用户并将其显示在网格中。表单之后,有一个链接"导出到 csv",这必须获取表单字段的值,传递给 Java(struts(,然后 Java 构造一个 csv 文件(与网格不同,它更复杂,许多表中的许多值(并将其返回给 extjs,之后,我想把它交给用户, 让他下载它。response.responseText 包含要导出的良好 csv,但它太大,无法执行编码 URI :(
我无法建议下载该文件。有人知道吗?:(
这是我现在做的源代码:
var params = Ext.getCmp("userSearchEngine").getForm().getValues(false);
Ext.Ajax.request({
url : cmts.server + 'exportToCSV.do',
method: 'POST',
headers: { 'Content-Type': 'text/csv'},
params : params,
success: function ( response, request ) {
console.log('success');
console.log(response.responseText);
},
failure: function ( response, request ) {
console.log('FAIL !');
}
});
感谢您的帮助:)
编辑:Java 部分写入响应的输出流
编辑2:由于一些限制,我无法在服务器端创建文件
我使用这种方法:
- 一个 Ext.form.FieldContainer 作为链接。
- 服务器端(在我的例子中是PHP(在"tmp"目录中生成文件。
- 服务器端返回有效的 JSON,其中包含生成的文件的名称。
- AJAX 请求更改 Ext.form.FieldContainer 的链接。
部分示例:
ExtJS 部分 - 字段容器:
{
id: 'generatecsv',
xtype: 'fieldcontainer',
width: 100,
layout: 'vbox',
items: [
{xtype: 'displayfield', value: ''},
{
id: 'dds19_link_disk',
xtype: 'box',
autoEl: {
html: '<a href="./tmp/" target="_blank">Download CSV</a>',
width: 100
}
}
]
}
ExtJS - AJAX 请求:
Ext.Ajax.request({
method: 'POST',
url: './src/xxxxx.php',
jsonData: Ext.JSON.encode({
}),
success: function(response){
var r = Ext.JSON.decode(response.responseText);
if (r.success == true) {
Ext.getCmp('generatecsv').el.update('<a href="./tmp/'+r.filename+'" target="_blank">ZIP архив</a>');
} else {
Ext.Msg.alert('Error', r.errmsg);
};
},
failure: function(response){
Ext.Msg.alert('Error', 'Error.');
}
});
来自服务器的有效 JSON:
{
"success": true,
"filename": "generated_file_name.csv"
}
对于下载文件,您可以尝试表单提交
var form = Ext.create('Ext.form.Panel', {
standardSubmit : true,
url : url,
method : 'POST' // OR 'GET'
});
form.submit({
target : '_blank',
params : {
}
});
在服务器端 - Java 中:
response.setContentType("application/vnd.ms-excel");
response.addHeader("Content-Disposition",
"attachment; filename=" + URLEncoder.encode(fileName)
+ ".csv");
IOUtils.copy(theCSVInputStream, response.getOutputStream())