圧縮ダウンロード
DEXTUploadNJ製品はバージョン1.3.0から、ファイルまたはディレクトリを圧縮してダウンロードすることができる機能を提供する。
FileDownloadクラスのdownloadZipメソッドは、ファイルやディレクトリを圧縮したファイルを作成した後、すぐにダウンロードを行い、DEXTUploadNJFilesToZipDownloadViewビュークラスは、Spring環境で対象を圧縮した後、すぐにダウンロードする。
- DEXTUploadNJ + 서블릿
-
public class DownloadServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); List<File> files = new ArrayList<File>(); files.add(new File("/src/test/resources/compress/....txt")); files.add(new File("/src/test/resources/compress/....pdf")); files.add(new File("/src/test/resources/compress/subA/subB/....txt")); files.add(new File("/src/test/resources/compress/....jpg")); files.add(new File("/src/test/resources/compress/....docx")); FileDownload dextnj = new FileDownload(); dextnj.downloadZip(request, response, null, files, null, null, false); } }サーブレット環境では、FileDownloadクラスのdownloadZipメソッドを使用して圧縮とダウンロードを同時に進行する。 圧縮はzipファイルのみをサポートし、ファイルのリストを持って処理をすれば、ファイルのパスを除いて一つ集め、圧縮ファイルを生成する。 圧縮されたファイルは、一時的な場所に作成がされ、ダウンロードする際に、ファイル名を指定しない場合は、対象のリストの最初のファイルの名前にzip拡張子を付ける。 圧縮するファイル名が英語でない場合には、多言語ファイル名をサポートするためにencodingパラメータに文字セットの名前を指定する。 通常の「UTF-8」を使用するが、nullに指定されると、現在のresponseオブジェクトに設定された文字セットをデフォルトとして使用する。 圧縮対象ファイルではなく、ディレクトリであれば、downloadZipメソッドにディレクトリパスを設定する。
public class DownloadServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); String targetDirPath = new File("/src/test/resources/compress/").getAbsolutePath(); FileDownload dextnj = new FileDownload(); dextnj.downloadZip(request, response, null, targetDirPath, true, null, null, false); } }ディレクトリを圧縮する際に、ファイルのリストだけを持って圧縮するときとは異なり、サブパスをツリー形式で保持し、圧縮される。 そしてincludeTargetDirNameパラメータを使用すると、ターゲットディレクトリから含めるか、子ファイル/ディレクトリから含めるかを決定することができる。
- DEXTUploadNJ + Spring Web Framework
-
Spring環境では、DEXTUploadNJFilesToZipDownloadViewビュークラスを使用して圧縮した後ダウンロードすることができる。
@Controller public class DownloadController { @RequestMapping(value = "/zip-download.do", method = RequestMethod.GET) public ModelAndView compressAndDownload() { List<File> files = new ArrayList<File>(); files.add(new File("/src/test/resources/compress/....txt")); files.add(new File("/src/test/resources/compress/....pdf")); files.add(new File("/src/test/resources/compress/subA/subB/....txt")); files.add(new File("/src/test/resources/compress/....jpg")); files.add(new File("/src/test/resources/compress/....docx")); DEXTUploadNJFilesToZipDownloadView view = new DEXTUploadNJFilesToZipDownloadView(); view.setEntries(files); view.setCharsetName("UTF-8"); return new ModelAndView(view); } }FileDownloadクラスのdownloadZipメソッドと同様に、ビュークラスもダウンロードするファイルの名前が決まらなければ、ターゲットリストの最初のファイル名にzipを付ける。 DEXTUploadNJFilesToZipDownloadViewクラスには、zipCharsetName属性があり、この属性を使用して多言語ファイル名を圧縮することができる。 一般的に、 "UTF-8"に設定し、もしnullの場合responseに設定された文字セットに続く。 もしresponseの文字セットを変更したい場合はDEXTUploadNJFilesToZipDownloadViewクラスのsetCharsetNameメソッドを使用して変更することができる。
ディレクトリを圧縮してダウンロードすると、DEXTUploadNJDirectoryToZipDownloadViewビュークラスを使用する。
前述したメソッドやクラスを持って圧縮をしたファイルは、VM(Virtual machine)が終了すると、削除がされるように設定されている。 もし圧縮されたファイルを保持する、上記のメソッドとクラスを使用せずにCompressUtilクラスを使用して直接圧縮する必要がある。 そしてCompressUtilクラスを使用して圧縮されたファイルをダウンロードするときは、既存のFileDownloadクラスのdownloadメソッドまたはDEXTUploadNJFileDownloadViewクラスを使用してダウンロードする。
List<File> files = new ArrayList<File>();
files.add(new File("/src/test/resources/compress/....txt"));
files.add(new File("/src/test/resources/compress/....pdf"));
files.add(new File("/src/test/resources/compress/subA/subB/....txt"));
files.add(new File("/src/test/resources/compress/....jpg"));
files.add(new File("/src/test/resources/compress/....docx"));
CompressUtil zipper = new CompressUtil();
// ファイルを圧縮する際に
File zippedFiles = zipper.zip(files, new File("/tmp"), "UTF-8", false, true);
// ディレクトリを圧縮する際に
File zippedDir = zipper.zip(new File("/src/test/resources/compress/"), true, new File("/tmp"), "UTF-8", false, true);
CompressUtilクラスはzip形式で圧縮するためにjava.util.zipパッケージを使用せずに、Apache Commons Compress™ライブラリを使用する。 DEXTUploadNJはJRE 1.6環境上で動作するが、java.util.zipは1.6ベースの多言語の名前を持つファイル名を処理できない問題があって、Apache Commons Compress™ライブラリを使用した。 したがって、zip圧縮機能を使用するには、Apache Commons Compress™ライブラリ(commons-compress-{version}.jar)を参照してヘジュオヤする。 (Apache Commons Compress™は1.6環境で1.12バージョンまでサポートします。)
リモートリポジトリを使用するMaven環境では、POMファイルに以下を追加すると、ライブラリを参照することができる。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.12</version>
</dependency>
ライブラリの詳細については、https://commons.apache.org/proper/commons-compress/を参照する。
圧縮ダウンロード制限事項は次のとおりである。
- zipファイルのみ圧縮することができる。
- 圧縮時間を減らすか、または、圧縮率を変更するためのさまざまなオプションを提供しない。
- 圧縮能力と制限事項は、Apache Commons Compress™スペックに準拠し、Apache Commons Compress™ライブラリが持つ問題点は、技術サポート対象ではない。
- 圧縮の過程はかなりのシステムリソースを消費するので、圧縮する対象が非常に多かったり、容量が大きく、圧縮作業が時間がかかる場合、サーバーのパフォーマンスに重大な影響を与えることができる。
- 圧縮時間は、圧縮する対象(個数、サイズ)、およびサーバーのCPUとファイルシステムのパフォーマンス、OS等サーバー環境に応じて、多くの違いがある。