Javaでのファイル出力(Struts2)
Java、Struts2でファイル出力をする方法を調査した。 OutputStreamWriterを使用し、responseにByteArrayOutputStreamから変換したByteArrayInputStreamを設定する。
@Result(name="success", value = "inputStream", params = { "inputName", "inputStream", "contentType", "application/octet-stream; charset=UTF-8", "contentLength", "${contentLength}", "contentDisposition", "attachment; filename=${fileName}" }, type = StreamResult.class) public class WriteAtion { /** HTTPレスポンス */ private HttpServletResponse response; /** ファイルダウンロード用InputStream */ private InputStream inputStream; /** ダウンロードファイル名 */ private String fileName; /** ダウンロードファイルサイズ */ private long contentLength; public String writeFile() { // SJISでのファイル出力 ByteArrayOutputStream stream = null; OutputStreamWriter writer = null; try { stream = new ByteArrayOutputStream(); writer = new OutputStreamWriter(stream, "SJIS"); // レコード出力 String fileText = "1行目"; writer.write(fileText); fileText = "2行目"; writer.write(fileText); writer.close(); } catch (UnsupportedEncodingException e) { return "ERROR"; } catch (IOException e) { return "ERROR"; } finally { IOUtils.closeQuietly(writer); } // ブラウザへのレスポンス処理 // ファイル名をセット this.setFileName("test.txt"); // ファイルサイズをフィールドに格納 this.setContentLength(stream.toByteArray().length); // コンテンツタイプをフィールドに格納 this.setContentType("text/txt"); // ファイルストリームをフィールドに格納 this.setInputStream(new ByteArrayInputStream(stream.toByteArray())); // ブラウザキャッシュ対策 this.response.setHeader("Cache-Control", "private"); this.response.setHeader("Pragma", "private"); return "SUCCESS"; } /** * HTTPレスポンスを取得します。 * @return HTTPレスポンス */ public HttpServletResponse getResponse() { return response; } /** * HTTPレスポンスを設定します。 * @param response HTTPレスポンス */ public void setResponse(HttpServletResponse response) { this.response = response; } /** * ファイルダウンロード用InputStreamを取得します。 * @return ファイルダウンロード用InputStream */ public InputStream getInputStream() { return inputStream; } /** * ファイルダウンロード用InputStreamを設定します。 * @param inputStream ファイルダウンロード用InputStream */ public void setInputStream(InputStream inputStream) { this.inputStream = inputStream; } /** * ダウンロードファイル名を取得します。 * @return ダウンロードファイル名 */ public String getFileName() { return fileName; } /** * ダウンロードファイル名を設定します。 * @param fileName ダウンロードファイル名 */ public void setFileName(String fileName) { this.fileName = fileName; } /** * ダウンロードファイルサイズを取得します。 * @return ダウンロードファイルサイズ */ public long getContentLength() { return contentLength; } /** * ダウンロードファイルサイズを設定します。 * @param contentLength ダウンロードファイルサイズ */ public void setContentLength(long contentLength) { this.contentLength = contentLength; } }