通过Rest下载CSV文件

时间:2014-02-19 09:33:17

标签: java rest csv opencsv

使用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();


}

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

3 个答案:

答案 0 :(得分:11)

要强制“另存为”,您需要在响应中设置内容处置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对象,因此可以避免写入磁盘。

答案 1 :(得分:3)

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

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

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

我想,就是这样。

答案 2 :(得分: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文件。