Java 通过Rest下载CSV文件

Java 通过Rest下载CSV文件,java,rest,csv,opencsv,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 FileWr

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


}

编辑:我不想先在光盘上保存/读取文件,您的代码无法编译,对吗?方法
downloadCsv()
声明返回类型
Object
,但不返回任何内容

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

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

我想,就是这样

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

Content-Disposition: attachment; filename="whatever.csv"
看起来您正在使用JAX-RS。这显示了如何设置标头。您可以将CSV写入HTTP响应流并在其中设置标头,或者返回一个
响应
对象,如下所示:

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

在这个过程的中间,你不需要给<代码>文件>代码>对象,这样就可以避免写入磁盘。

<代码>响应。
            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();
response.setContentType(“text/csv”); OutputStreamWriter osw=新的OutputStreamWriter(response.getOutputStream(),“UTF-8”); 列表结果=iSmsExportService.csvExport(列名称); CSVWriter CSVWriter=新的CSVWriter(osw,;); csvWriter.writeAll(结果); csvWriter.flush(); csvWriter.close();
在此之后已开始下载CSV文件。

如果我返回一个字符串,用户是否会获得一个浏览器保存/打开对话框?这就是我需要的。这取决于用户浏览器的配置和类型。但方法的返回类型不影响此过程。内容类型有。据我所知,IE的默认行为是询问用户将下载的文件存储在哪里。我已经更新了答案。一种简单的方法是从CSVWriter中取出字符串。我使用JacksonCSV而不是OpenCSV,但我认为这相当简单。您可以使用StringWriter而不是FileWriter,例如。是的。只需将其写入字符串,而不是文件。返回响应而不是对象。试试看。