【问题标题】:Download CSV file via Rest通过 Rest 下载 CSV 文件
【发布时间】:2014-03-19 12:51:06
【问题描述】:

使用 OpenCSV,我可以成功地在磁盘上创建 CSV 文件,但我真正需要的是允许用户使用下载按钮下载 CSV,我不需要保存在磁盘上,只需下载即可。有任何想法吗?

@GET
@Path("/downloadCsv")
public Object downloadCsv() {
        CSVWriter writer;
        FileWriter wr; 
      //Or should I use outputstream here?   
        wr= new FileWriter("MyFile.csv");
        writer = new CSVWriter(wr,',');
        for (Asset elem: assets) {
            writer.writeNext(elem.toStringArray());
        }
        writer.close();


}

编辑:我不想在光盘上保存/读取文件

【问题讨论】:

    标签: java rest csv opencsv


    【解决方案1】:

    要强制“另存为”,您需要在响应中设置内容处置 HTTP 标头。它应该是这样的:

    Content-Disposition: attachment; filename="whatever.csv"
    

    看起来您正在使用 JAX-RS。这个question 展示了如何设置标题。您可以将 CSV 写入 HTTP 响应流并在那里设置标头,也可以像这样返回 Response 对象:

    return Response.ok(myCsvText).header("Content-Disposition", "attachment; filename=" + fileName).build();
    

    您不需要在此过程中间写入File 对象,因此可以避免写入磁盘。

    【讨论】:

    • 我已经更新了我的答案。一种简单的方法是从 CSVWriter 中取出字符串。我使用 JacksonCSV 而不是 OpenCSV,但我想这相当容易。例如,您可以使用 StringWriter 而不是 FileWriter。
    • 是的。只需将其写入字符串而不是文件。返回响应而不是对象。试试看。
    【解决方案2】:

    首先,您的代码无法编译,对吧?方法 downloadCsv() 声明返回类型 Object 但不返回任何内容。

    我会将声明更改为 String downloadCsv() 并将 CSV 的内容作为字符串返回。为此,请使用 StringWriter 而不是 FileWriter,然后说 return wr.toString()

    这里唯一缺少的是内容类型。您将方法注释为@Produces({"text/csv"})

    我想,就是这样。

    【讨论】:

    • 如果我返回一个字符串,那么用户会得到一个浏览器保存/打开对话框吗?这就是我需要的
    • 这取决于用户浏览器的配置和类型。但是方法的返回类型不影响这个过程。内容类型。
    • 据我所知,IE 的默认行为是询问用户将下载的文件存储在哪里。
    【解决方案3】:
                response.setHeader("Content-Disposition", "attachment; filename=" + filename + ".csv");
                response.setContentType("text/csv");
                OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream(), "UTF-8");
    
                List<String[]> result = iSmsExportService.csvExport(columnNames);
                CSVWriter csvWriter = new CSVWriter(osw, ';');
                csvWriter.writeAll(result);
                csvWriter.flush();
                csvWriter.close();
    

    此后开始下载 CSV 文件。

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2016-09-18
      • 1970-01-01
      • 2019-10-27
      • 2019-07-24
      相关资源
      最近更新 更多