使用struts 2下载为csv

时间:2015-06-12 00:07:07

标签: java ajax jsp csv struts2

我想将一些数据写入csv文件,用户应该可以通过浏览器下载。

@Actions({ @Action(value = "/downloadReport", results = { @Result(name = "success", type = "stream", params = {
    "contentType", "${type}", "inputName", "stream", "bufferSize","2048", "contentDisposition",   
    "attachment;filename=\"${filename}\"" }) }) })
@SkipValidation
public String downloadReport() throws BaseAppException {

     try {
            filename =AdSkippingConstants.REPORT_FILE_NAME;
            type = AdSkippingConstants.CSV_FILE_TYPE;
            File file = new File(filename);
            FileUtils.write(file, "Helloo World");
            stream = new FileInputStream(file);
        } 
        catch (IOException e) {
        logger.error("Error occured while exporting error data", e);
        } 
        return SUCCESS;
       }

在jsp中我正在使用ajax调用

    function exportAsCSV(){
      $.ajax({
      url: 'downloadReport.action?',
      type: "POST",
       success: function() {
        //To Un Block the Change Password page if the page reloaded
          //$('div.ui-dialog').unblock();
         // $('#change_password_details_body').html(data);
      },
      error: function(){
        //To Un Block the Change Password page if the page reloaded with error.
          //$('div.ui-dialog').unblock();
      }
});
}

我能够得到响应,甚至fileDownload = true即将响应,但仍然下载到csv选项没有在任何浏览器中打开,也请让我知道如何将html数据传递给动作以写入csv。< / p>

在jsp中,我使用此代码进行ajax调用

var gridModel = "gridModel";
var sortname = "1";
var sortorder = "asc";
var caption = '<s:text name="grid.label.heading" />';
var url = "getGridSearchResults.action";
init.push(function() {
    loadTable("gridtable", url, gridModel, columnDefs, columns, sortname,
            sortorder, caption);
});

 <table cellpadding="0" cellspacing="0" border="0"  class="table table-   striped table-bordered" id="gridtable"></table>   

所以使用ajax调用我正在加载表的数据。

2 个答案:

答案 0 :(得分:1)

您不需要AJAX。这是一个普遍的误解。

您只需要对返回stream结果的操作执行调用,并使用contentDisposition: attachment HTTP标头。

这将告诉浏览器下载文件而不是内联打开它。

Read more in this answer

编辑:如果您需要将HTML表中的数据发送到操作,则需要

  • use hidden input fields与您使用<s:property/>标签打印的价值相同(或其他);
  • specify an index使用list[%{#status.index}].attribute符号将不同记录发布为集合的不同元素。

答案 1 :(得分:0)

我用它完成了:

ActionContext.getContext().getSession().put("RESULTS_GRID", searchResultsForDownload);

然后检索我的DownLoadAction中的列表以获取数据并使用BufferedWriter写入csv。