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
オブジェクトに書き込む必要がないため、ディスクへの書き込みを回避できます。
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ファイルのダウンロードを開始しました。
まず、コードをコンパイルできませんよね?メソッドdownloadCsv()
は戻り値の型Object
を宣言しますが、何も返しません。
宣言をString downloadCsv()
に変更し、CSVの内容を文字列として返します。これを行うには、StringWriter
の代わりにFileWriter
を使用してから、return wr.toString()
と言います。
ここで欠落しているのはコンテンツタイプだけです。メソッドに@Produces({"text/csv"})
としてアノテーションを付けます。
それだけだと思います。