使用 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();
}
编辑:我不想在光盘上保存/读取文件
要强制"另存为",您需要在响应中设置内容处置 HTTP 标头。 它应该看起来像这样:
Content-Disposition: attachment; filename="whatever.csv"
看起来您正在使用 JAX-RS。 此问题显示如何设置标头。 您可以将 CSV 写入 HTTP 响应流并在那里设置标头,也可以返回一个Response
对象,如下所示:
return Response.ok(myCsvText).header("Content-Disposition", "attachment; filename=" + fileName).build();
在此过程中,您不需要写入File
对象,因此可以避免写入磁盘。
首先,你的代码不能被编译,对吧?方法 downloadCsv()
声明返回类型 Object
,但不返回任何内容。
我将声明更改为String downloadCsv()
并将 CSV 的内容作为字符串返回。为此,请使用StringWriter
而不是FileWriter
,然后说return wr.toString()
。
这里唯一缺少的是内容类型。您将方法注释为 @Produces({"text/csv"})
。
我想,就是这样。
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文件。