ファイルを圧縮してダウンロードする

基本的な例 > マルチモジュール > 例12

説明

DEXTUploadX5はバージョン1.3.0.0から圧縮ダウンロードをサポートしています。

複数のファイルを同時に受信するために、圧縮ダウンロードはターゲットファイルを1つの圧縮ファイルにパックするようサーバーに依頼し、圧縮ファイルをダウンロードします。他の例の単一/複数ファイルダウンロードの例とは異なり、圧縮処理はサーバーによって処理されるため、圧縮ダウンロードはターゲットファイルへのダウンロードパスを指定する属性(downUrl)の影響を受けません。

圧縮ダウンロードを行うには、圧縮処理を行うアドレスを指定し、setCompressURLメソッドで圧縮ファイルをダウンロードするパス値を返す必要があります。シングル/マルチダウンロードとは異なり、圧縮ダウンロードを開始する際にはdownloadCompressedメソッドが使用されます。

var dx = dx5.get("component-id");

// downUrlプロパティは不要です。
// サーバ上のターゲットを区別するために、vindexプロパティの値を指定する必要があります。
// vindex は一意の文字列値で、仮想ファイルを区別する唯一の方法です。
dx.addVirtualFile({ vindex: "IDX0003", name: "bridge_509147.jpg", size: 509147 });
dx.addVirtualFile({ vindex: "IDX0004", name: "beach_239826.jpg", size: 239826 });
dx.addVirtualFile({ vindex: "IDX0005", name: "cosmos (empty) 195779.jpg", size: 195779 });

// 圧縮処理を行うアドレスを設定し、圧縮ファイルのダウンロードパスを返す。
dx.setCompressURL("http://domain/path../service/compress.do");

// フラグの値に従ってダウンロードを実行する。
// AUTO: 圧縮された仮想ファイルをダウンロードする。
// SELECTED: 選択された仮想ファイルを圧縮してダウンロードします。
// CHECKED: チェックされた仮想ファイルを圧縮してダウンロードします。
dx.downloadCompressed("SELECTED");

ファイルの圧縮とダウンロードはFileServiceControllerのmakeCompressedFileメソッドで処理され、compress.doにマッピングされる。DEXTUploadX5は、downloadCompressedメソッドが呼び出されると、POSTメソッドで「DEXTUploadX5_VIndexes」という名前のフォームデータをサーバーに送信し、ダウンロードする仮想ファイルのvindexプロパティ値は、カンマ(,)をセパレータとするリストである。

圧縮されている場合は、対象の圧縮ファイルをダウンロードするためのパスをレスポンスとしてクライアントに送信しなければならない。

@RequestMapping(value = "/service/compress.do", method = RequestMethod.POST)
public void makeCompressedFile(@RequestParam(value = "DEXTUploadX5_VIndexes") String vindices, HttpServletRequest request, HttpServletResponse response) throws IOException {
    
    String fileRoot = servletContext.getRealPath("/files");
    
    List<File> files = new ArrayList<File>();
    String[] tokens = vindices.split(",");
    for (int i = 0; i < tokens.length; i++) {
        if (tokens[i].equals("IDX0003"))
            files.add(new File(fileRoot, "attach/bridge_509147.jpg"));
        if (tokens[i].equals("IDX0004"))
            files.add(new File(fileRoot, "attach/beach_239826.jpg"));
        if (tokens[i].equals("IDX0005"))
            files.add(new File(fileRoot, "attach/cosmos (empty) 195779.jpg"));
    }
    
    // 一時的な場所に圧縮ファイルを作成する。
    CompressUtil cu = new CompressUtil();
    File zipped = cu.zip(files, new File(fileRoot, "/temp/"), "UTF-8", false, false);
    
    ...
    
    String compresskey = FileRepository.addFileEntity(target);
    
    response.setContentType("text/plain");
    
    // この例では、同じサーブレットを GET リクエストすることで、圧縮ファイルをダウンロードできます。
	// compresskeyクエリ文字列は、何をダウンロードするかを指定します。
    response.getWriter().write(request.getRequestURL().append("?compresskey=".concat(compresskey)).toString());
}

ファイルのダウンロードはFileServiceControllerのdownloadCompressedFileメソッドで処理され、compress.doにマッピングされます。

@RequestMapping(value = "/service/compress.do", method = RequestMethod.GET)
public ModelAndView downloadCompressedFile(@RequestParam(value = "compresskey") String key, HttpServletResponse response) throws IOException {
    
    FileEntity target = FileRepository.getFileEntity(key);
            
    if (target != null) {
        DEXTUploadNJFileDownloadView dextnj = new DEXTUploadNJFileDownloadView();
        dextnj.setFile(target.getFile());
        dextnj.setCharsetName("UTF-8");
        
        // 圧縮ダウンロードには、部分コンテンツダウンロード関数を使用しないでください。(デフォルト) 
        dextnj.setAllowingWeakRange(false);
        dextnj.setUseClientCache(false);
        
        // 圧縮ファイルはテンポラリファイルなので、レスポンスデータを書き込んだら削除する。
        dextnj.setRemoveAfterDownloading(true);
        
        return new ModelAndView(dextnj);
    } else {
        response.sendError(HttpServletResponse.SC_NOT_FOUND, "キーのファイルが見つかりません。");
        return null;
    }
}

ファイルの圧縮は、サーバーのリソース(CPU、I/O)を大量に消費する作業であるため、大きなファイルや圧縮ファイルが大量にある場合、状況によってはファイル圧縮処理の待ち時間が長くなり、セッションが切断される問題や、サービス自体が停止する重大な問題に発展する可能性があります。したがって、圧縮ダウンロードに対するポリシー制限を設定した後、本機能を使用することを推奨する。

DEXTUploadNJ製品は圧縮のためにCompressUtilというクラスを提供し、Apache Commons Compressライブラリを使用する。詳細はDEXTUploadNJ製品のマニュアルを参照してください。

圧縮ダウンロード

圧縮はサーバー上で進行します。圧縮中はプログレスウィンドウが表示されますが、圧縮されたファイルをダウンロードするときは、1ファイルのダウンロードが実行されます。そのため、ダウンロード中のプログレスウィンドウは表示されません。