zipファイルにまとめる
zipにファイルをまとめるという機能は、帳票システムを作成する上では欠かせない機能の一つかと思います。
今回は対象ファイルだけをターゲットにしていますが、実際の開発では管理者が作成した契約書をファイルに変換してzipにまとめる。その後、ダウンロードさせる。
などという一連の流れになるのではないでしょうか。
その場合でも、今回紹介する処理を応用すれば比較的簡単に対応できるかと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class createZip { public static void main(String[] args) { // 文字コード Charset charset = Charset.forName("UTF-8"); // 入力ファイル Path path = Paths.get("/tmp/test/test.txt"); // zip内階層 String zipDir = "test/test.txt" // 出力ファイル String outfile = "~/Desktop/" + test.zip; try( FileOutputStream fos = new FileOutputStream(outfile); BufferedOutputStream bos = new BufferedOutputStream(fos); ZipOutputStream zos = new ZipOutputStream(bos,charset); ) { // zipの中のファイル byte[] data = Files.readAllBytes(path); ZipEntry zip = new ZipEntry(zipDir); zos.putNextEntry(zip); zos.write(data); } catch (IOException e) { e.printStackTrace(); } } } |
デスクトップに置かれたtest.zipを解凍すると、zip内階層で指定したtest/test.txtという階層でフォルダ、ファイルが作成されていることかと思います。
もし、複数のファイルを対象とする場合はfor文を用いてファイルの数だけエントリーを行うように修正すればよいと思います。
作成したzipをダウンロードするには、zipのパスをFileDataSource型に変換して、httpレスポンスのボディーに埋め込んであげる処理を追加すれば何とかなるのではないでしょうか。
また、今回は参考としてファイル名、パスなどをハードコードとして記述しています。
しかしそれでは再利用性、汎用性の高いコードとは言えないので、例えば設定値として登録してあげることでより良いコードとなるでしょう。