www.dextsolution.com
DEXTUPLOAD
JK
menu toggle製品の説明 > 圧縮ダウンロード

圧縮ダウンロード

DEXTUploadJK製品は、ファイルまたはディレクトリを圧縮してダウンロードする機能を提供します。

FileDownloadクラスのdownloadZipメソッドは、ファイルやディレクトリを圧縮したファイルを作成した直後にダウンロードを行い、JKFilesToZipDownloadView, JKDirectoryToZipDownloadViewクラスは、Spring環境でターゲットを圧縮してダウンロード操作を実行します。

Servet/JSP 環境
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 fileDownload = new FileDownload();
        // 圧縮するファイルのリストを設定
        fileDownload.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 fileDownload = new FileDownload();
        // 圧縮するディレクトリを設定
        fileDownload.downloadZip(request, response, null, targetDirPath, true, null, null, false);
    }
}

ディレクトリを圧縮するときにはファイルリストだけを持って圧縮するときとは異なり、サブパスをツリーの形で維持して圧縮される。 そして、includeTargetDirNameパラメータを使用すると、ターゲットディレクトリから含めるのか、子ファイル/ディレクトリから含めるのかを決定できます。

Spring MVCまたはSpring Boot環境

Spring環境では、JKFilesToZipDownloadViewビュークラスを使用して圧縮後にダウンロードできます。

@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"));
		
        JKFilesToZipDownloadView view = new JKFilesToZipDownloadView();
			
        view.setEntries(files);
        view.setCharsetName("UTF-8");
			
        return new ModelAndView(view);
    }
}

FileDownloadクラスのdownloadZipメソッドと同様に、ビュークラスもダウンロードするファイル名が決まっていない場合、ターゲットリストの最初のファイル名にzip を付ける。 JKFilesToZipDownloadViewクラスにはzipCharsetName属性があり、この属性を使用して多言語ファイル名を圧縮できます。 通常は "UTF-8"に設定し、nullの場合はresponseに設定されている文字セットに従います。 responseの文字セットを変更したい場合は、JKFilesToZipDownloadViewクラスのsetCharsetNameメソッドを使用して変更できます。

ディレクトリを圧縮してダウンロードするときは、JKDirectoryToZipDownloadViewクラスを使用する必要があります。

前述のメソッドやクラスを使って圧縮したファイルは、VM(Virtual machine)が終了すると削除されるように設定されている。 圧縮されたファイルを維持するには、上記のメソッドとクラスを使用せずにCompressUtilクラスを使用して直接圧縮する必要があります。 また、CompressUtilクラスを使用して圧縮ファイルをダウンロードするときは、既存のFileDownloadクラスのダウンロードメソッドまたはJKFileDownloadViewクラスを使用して ダウンロードする。

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™ライブラリを使用します。 したがって、zip圧縮機能を使用するには、Apache Commons Compress™ライブラリ(commons-compress-{version}.jar)を参照する必要があります。

リモートリポジトリを使用するMaven環境では、pom.xmlファイルに次のものを追加するとライブラリを参照できます。

<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などのサーバー環境によって大きく異なります。