JAVA(Spring)でファイルをzip化してダウンロードする方法

色々な種類のファイルをzip化することが出来るのですが、

ここでは、例としてPDFファイルをZIP化してダウンロードさせるソースを書いてみます。

ポイントはZIPファイルをサーバに保持せずに、ストリームでダウンロードさせるところです。

//コントローラでの処理になります。
@PostMapping(value="doDownloadZip")
public void doDownloadPdf(HttpServletResponse response) throws Exception{
    //各種変数を用意
    byte[] buf = new byte[1024];
    int len;
    InputStream in = null;

    //ダウンロード対象のコンテンツタイプを指定
    response.setContentType("application/zip");
    //文字コードを指定
    response.setCharacterEncoding("windows-31j");
       
    //ヘッダ情報をセットする。
    response.setHeader("Content-Disposition",
            "attachment; filename=" + URLEncoder.encode("AAA.zip", "windows-31j"));
    response.setHeader("Content-Encoding", "binary");
    
    //ZIP処理を開始する。
    // tryの引数としてファイル操作を指定するとクローズ処理は不要となるのでオススメ
    try (ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()))) {
        //※複数のPDFをzip化する必要がある場合には、ループなどで下記すべての処理を繰り返してください。
        //インプットストリームに対象のファイルをセット ※実際にはここは動的で取得することになります。
        in = new FileInputStream("/pdf/test1.pdf");
        
        // ZIPへのの書き込みを開始する。
        zos.putNextEntry(new ZipEntry(new File("test1.pdf")); //※実際にはここは動的で取得することになります。
        while ((len = in.read(buf)) > 0) {
            zos.write(buf, 0, len);
        }
    } catch (FileNotFoundException e) {
        // ファイルが存在しない場合のエラー
        throw e;
    } finally {
        if (in != null) {
            in.close();
        };
    }
}

コメント

タイトルとURLをコピーしました