使用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
答案 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文件。