EXTJS & Java Struts 导出 csv 文件



我想制作一个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:由于一些限制,我无法在服务器端创建文件

我使用这种方法:

  1. 一个 Ext.form.FieldContainer 作为链接。
  2. 服务器端(在我的例子中是PHP(在"tmp"目录中生成文件。
  3. 服务器端返回有效的 JSON,其中包含生成的文件的名称。
  4. 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())

最新更新