じぶんメモ

プログラミングのメモ、日常のメモとか。

Javaでのファイル出力(Struts2)

JavaStruts2でファイル出力をする方法を調査した。 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;
  }

}