web-dev-qa-db-ja.com

Rest経由でCSVファイルをダウンロード

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


}

編集:ディスクにファイルを保存/読み取りしたくない

5
Spring

「名前を付けて保存」を強制するには、応答にコンテンツ処理HTTPヘッダーを設定する必要があります。次のようになります。

Content-Disposition: attachment; filename="whatever.csv"

JAX-RSを使用しているようです。この 質問 はヘッダーの設定方法を示しています。 CSVをHTTP応答ストリームに書き込んでそこにヘッダーを設定するか、次のようにResponseオブジェクトを返すことができます。

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

このプロセスの途中でFileオブジェクトに書き込む必要がないため、ディスクへの書き込みを回避できます。

15
tom
            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ファイルのダウンロードを開始しました。

4
Reeebuuk

まず、コードをコンパイルできませんよね?メソッドdownloadCsv()は戻り値の型Objectを宣言しますが、何も返しません。

宣言をString downloadCsv()に変更し、CSVの内容を文字列として返します。これを行うには、StringWriterの代わりにFileWriterを使用してから、return wr.toString()と言います。

ここで欠落しているのはコンテンツタイプだけです。メソッドに@Produces({"text/csv"})としてアノテーションを付けます。

それだけだと思います。

3
AlexR