ファイルの圧縮とダウンロード

ホーム > Basic examples > 例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");

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

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

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	List<File> files = new ArrayList<File>();
	String vindices = request.getParameter("DEXTUploadX5_VIndexes");
	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());
}
/**
 * ファイル(圧縮)のダウンロードを実行する。
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	String compresskey = request.getParameter("compresskey");
	
	// 圧縮オブジェクトを取得します。
	...
	
	if (target != null) {
		FileDownload dextnj = new FileDownload();
		
		// 圧縮ダウンロードには、部分的なコンテンツのダウンロード関数を使用しないでください。(デフォルト) 
		dextnj.setAllowingWeakRange(false);
		
		// 圧縮ファイルは一時ファイルなので、レスポンスデータの書き込み後に削除する。
		dextnj.setRemoveAfterDownloading(true);
		
		// ダウンロード時にクライアントキャッシュが使用されないようにパラメータを設定します。
		dextnj.download(request, response, target.getFile(), target.getFilename(), null, false, false);
	} else {
	    response.sendError(404);
	}
}

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

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

圧縮ダウンロード

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