【问题标题】:Generate/download CSV file without storing on server生成/下载 CSV 文件而不存储在服务器上
【发布时间】:2016-07-04 11:24:46
【问题描述】:

我正在使用 Java 中的 apache.commons.csv 库来生成 CSV 并使其可下载,而无需使用以下代码存储在服务器上:

try (OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream())){
        csvWriter = new CSVPrinter(osw,CSVFormat.DEFAULT);

        writer.printRecord(row);
        response.setContentType("text/csv");
        response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + "\";");
catch(Exception e) {
        //Exception block
}
finally {
        try {
            csvWriter.flush();
        } catch (IOException e) {
            logger.error("Exception while flushing file writer and CSV writer",e);
        }

    }

但它在浏览器上显示 csv,而不是要求我另存为下载选项。

代码有什么问题或者有其他方法可以做到这一点吗?

【问题讨论】:

  • 两个螺丝钉:撒谎,让文件名以.xls结尾,Content-Type可能是“application/vnd.ms-excel”
  • @JoopEggen 它不起作用,仍在浏览器上打开
  • Content-Type application/bin 经常用于纯下载,应该这样做,因为浏览器无法打开。
  • 哦,先设置标题,再写!抱歉没看到。但是 application/bin 仍然成立。标题行在空行之前输出,然后是内容,小输出的缓冲往往使顺序无关,但原则上应保持顺序。
  • 感谢@JoopEggen,问题仅与标题有关。设置标题首先工作

标签: java csv apache-commons-csv


【解决方案1】:

您可以参考下面的代码。这将要求您弹出“保存”。

将请求属性中的数据设置为 ArrayList,如 request.setAttribute("list", list) 并将其发送到 JSP 文件中。

将此代码写入您的 JSP 文件中。

<%
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-disposition","attachment; filename=Report_File_Name.xls");
    response.setHeader("CookiesConfigureNoCache", "false");             
    response.setHeader("Pragma","private,no-cache");     
    response.setHeader("Cache-control","private,no-store,no-cache,max-age=0,must-revalidate");

    ArrayList<String> List = (ArrayList<String>) request.getAttribute("list");
        for(int i = 0; i < List.size(); i++){
    %>
            <%=List.get(i).toString()%><br>
    <%
        }

    %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-08
    • 2021-06-22
    • 2015-07-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多