じぶんメモ

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

Javaでファイルダウンロード

Javaでファイルをダウンロードする方法について調査した。
ファイルをBufferedInputStreamにし、viewへのリターン時にアノテーションでパラメータとして設定する。
以下Struts2を使用した実装例。

 

@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 DownloadAtion {
  /** ファイルダウンロード用InputStream */
  private InputStream inputStream;
  /** ダウンロードファイル名 */
  private String fileName;
  /** ダウンロードファイルサイズ */
  private long contentLength;

  public String download() throws Exception {
    String sampleFilePath = "/usr/local/files/test.txt";
    File downloadFile = new File(sampleFilePath);

    // ファイルが存在し、ディレクトリで場合にダウンロードを行う。
    if (downloadFile.exists() && !downloadFile.isDirectory()) {
      try {
        // ダウンロード用にinputStream化する。
        inputStream = new BufferedInputStream(new FileInputStream(sampleFilePath));
        // ファイル名
        fileName = URLEncoder.encode(downloadFile.getName(), "UTF-8");fileName = URLEncoder.encode(downloadFile.getName(), "UTF-8");
        // ファイルのバイト数
        contentLength = downloadFile.length();
    
        return "success";
      } catch (Exception e) {
        return "error";
      }
    }

    // ファイルが存在しないか、パスがファイルでない場合はエラーを返す。
    return "error";
  }

  /**
   * ファイルダウンロード用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;
  }

}