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

圧縮ダウンロード

DEXTUploadX5バージョン1.3.0.0から圧縮ダウンロードに対応しました。 圧縮ダウンロードはダウンロードを一つの圧縮ファイルにまとめるダウンロードです。

1つ注意すべき点は、ファイルを圧縮する役割は、サーバーが担当しているものであり、DEXTUploadX5製品でファイルを圧縮する機能を持っているわけではない。DEXTUploadX5はダウンロード対象のvindex属性値をサーバーに転送する。サーバーはvindex値を持って圧縮する対象を選定して1つの圧縮ファイルを生成することになる。圧縮ファイルが作成されると、そのファイルをダウンロードすることができるパスをクライアントに返し、DEXTUploadX5がダウンロードパスを受け、再起動するように実装されている。

サーバーは、ファイルを圧縮することができる機能を持っている必要がありますが、いくつかの圧縮ライブラリを使って機能を実装することができますが、Javaプラットフォームであれば、ファイル圧縮のダウンロードを一緒にサポートしているDEXTUploadNJ自社製品を使用することもできる。

ダウンロードアイテムを登録する

DEXTUploadX5はダウンロードする項目を必ず仮想ファイルに登録する必要がある。

仮想ファイルは、ユーザーのローカルPC上に存在せず、実体のない仮想のファイルをいう。つまり、実際にローカルに存在しないファイルなので、ファイルのアップロード先ではない。一般的に、仮想ファイルは既にアップロードされたファイルに関する情報を残す目的で使用したりする。(サーバーに存在するファイルと呼ばれる表示)

仮想ファイルを登録するには、addVirtualFile関数を使用するかaddVirtualFileList関数を使用して、jsonオブジェクトの形式で登録される。

  • vindex:仮想ファイルを区分する唯一のキーとして、どのような形式でも構いませんが、重複してはならない。(必須項目)
  • name:仮想ファイルの名前である。(必須項目)
  • size:仮想ファイルのサイズであり、byte単位を使用する。(必須項目)
  • lock:ロック状態がtrueの場合、ファイルを削除することができない。
var dx = dx5.get(id);
// 個別に登録するときに
dx.addVirtualFile({ vindex: "IDX0001", name: "virtual_file.txt", size: 12345 });
dx.addVirtualFile({ vindex: "IDX0002", name: "locked-virtual_file.txt", size: 45678, lock: true });
dx.addVirtualFile({ vindex: "IDX0003", name: "cosmos.jpg", size: 195779 });

// 複数のを一度に登録するとき
dx.addVirtualFileList([
  { vindex: "IDX0001", name: "virtual_file.txt", size: 12345 },
  { vindex: "IDX0002", name: "locked-virtual_file.txt", size: 45678, lock: true },
  { vindex: "IDX0003", name: "cosmos.jpg", size: 195779 }
]);

シングル/マルチファイルのダウンロードとは異なり、圧縮ダウンロードを使用する場合はurl(またはdownUrl)属性を設定する必要がない。圧縮ダウンロードはファイルを圧縮して、そのダウンロードパスを返す役割を担うアドレスのみが必要である。したがって、それぞれの仮想ファイルごとに設定したurl(またはdownUrl)属性は、圧縮ダウンロードは影響を及ぼさない。

圧縮パスを設定する

ダウンロード対象を仮想ファイルに登録する作業が終わったら、圧縮を担当するパスを設定ヘジュオヤする。圧縮パスはsetCompressURLメソッドを使用して一度だけ登録すればよい。

パスは、スキーマ(http、https)で始まるWeb URLべきである。

function onDX5Created(id) {
  var dx = dx5.get(id);
    
  dx.addVirtualFile({ vindex: "IDX0001", name: "virtual_file.txt", size: 12345 });
  ...
  dx.addVirtualFile({ vindex: "IDX0005", name: "cosmos (empty space) 195779.jpg", size: 195779 });

  // 圧縮を処理するパスを設定する。
  dx.setCompressURL("http://domain/path/compress.do");
}
ボタンの接続

仮想ファイルと圧縮ダウンロードパスの設定が完了したら、downloadCompressedメソッドを使用して圧縮のダウンロードを開始すればよい。

<button type="button" onclick="compress('component-id');">圧縮ダウンロード</button>
<script>
function compress(id) {
  // フラグの値に基づいて、ターゲットを変えて圧縮ダウンロードを実行する。
  // AUTO:全仮想ファイルを圧縮ダウンロードする。
  // SELECTED:選択された仮想ファイルを圧縮ダウンロードする
  // CHECKED:チェックされた仮想ファイルを圧縮ダウンロードする。
  dx5.get(id).downloadCompressed("AUTO");
}
</script>

複雑なスクリプトを使用せずに、コンポーネントのロード時に自動的にバインド機能も付属しています。

<button type="button" id="btn-compress-auto">圧縮ダウンロード</button>
<button type="button" id="btn-compress-selected">選択圧縮ダウンロード</button>
<button type="button" id="btn-compress-checked">チェック圧縮ダウンロード</button>
<script>
  dx5.create({
    ...,
    // コンポーネントが作成されるとき、圧縮ダウンロード機能が自動的に接続するようにする。
    btnDownloadCompressedAuto: "btn-compress-auto", 
    btnDownloadCompressedSelected: "btn-compress-selected", 
    btnDownloadCompressedChecked: "btn-compress-checked"
  });
</script>

自動バインディング機能は非常に便利が、複雑な機能を実装するには適さないことがあります。

サーバー側の処理(Javaサーブレット環境+ DEXTUploadNJ)

compress.doにマップされたサーブレット(JSPも可能)でCompressUtilクラスを使用して圧縮タスクを処理することができる。

DEXTUploadX5はdownloadCompressedメソッドを呼び出すと、vindex属性値をコンマ(、)文字を区切り文字とするリストの文字列を生成し、この値を「DEXTUploadX5_VIndexes」の名前が与えられてたフォームデータをPOST形式でsubmitする。

/**
 * DEXTUploadX5は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 space) 195779.jpg"));
  }
      
  // 一時的な場所に圧縮ファイルを生成する。
  CompressUtil cu = new CompressUtil();
  File zipped = cu.zip(files, new File(fileRoot, "/temp/"), "UTF-8", false, false);

  ...

  String compresskey = FileRepository.addFileEntity(target);
  
  // 圧縮が終了するとGET方式でダウンロードを要求できるようにダウンロードパスを返すとされる。
  // ダウンロードパスは、http、httpsが含まれている完全なパスでなければならない。
  // ダウンロードパスは、圧縮ファイルの実際のパスを含む方法でサーバー内のパスを公開することはなく、これを分泌する方法を使用することをお勧めします。
  response.setContentType("text/plain");  
  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();
    // 圧縮ダウンロードはpartial content download機能は使用しないようにする。(デフォルト)
    dextnj.setAllowingWeakRange(false);
    // 圧縮ファイルは、一回限りのファイルであるため、応答データに記録が終了すると、削除する。
    dextnj.setRemoveAfterDownloading(true);
    // ダウンロードするときに、クライアントのキャッシュが使用されないようにパラメータを設定する。
    dextnj.download(request, response, target.getFile(), target.getFilename(), null, false, false);
  } else {
    response.sendError(404);
  }
}
サーバー側の処理(Spring Web Framework環境+ DEXTUploadNJ)

compress.doにマップされたコントローラのメソッドでCompressUtilクラスを使用して圧縮処理を実行する。

@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 space) 195779.jpg"));
  }
      
  // 一時的な場所に圧縮ファイルを生成する。
  CompressUtil cu = new CompressUtil();
  File zipped = cu.zip(files, new File(fileRoot, "/temp/"), "UTF-8", false, false);
      
  ...
      
  String compresskey = FileRepository.addFileEntity(target);      
  
  // 圧縮が終了するとGET方式でダウンロードを要求できるようにダウンロードパスを返すとされる。
  // ダウンロードパスは、http、httpsが含まれている完全なパスでなければならない。
  // ダウンロードパスは、圧縮ファイルの実際のパスを含む方法でサーバー内のパスを公開することはなく、これを分泌する方法を使用することをお勧めします。
  response.setContentType("text/plain");
  response.getWriter().write(request.getRequestURL().append("?compresskey=".concat(compresskey)).toString());
}

対象のファイルを圧縮した後、圧縮ファイルをダウンロードしなければならない。前の応答データに記録された値がすぐに圧縮ダウンロードをダウンロードすることができ、サーバー側のパスであり、これは、次のような方法で実装することができる。

@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");
    // 圧縮ダウンロードはpartial content download機能は使用しないようにする。(デフォルト)
    dextnj.setAllowingWeakRange(false);
    // 圧縮ダウンロードは、クライアントのキャッシュが使用されないようにする。
    dextnj.setUseClientCache(false);
    // 圧縮ファイルは、一回限りのファイルであるため、応答データに記録が終了すると、削除する。
    dextnj.setRemoveAfterDownloading(true);
            
    return new ModelAndView(dextnj);
  } else {
    response.sendError(HttpServletResponse.SC_NOT_FOUND, "Not found.");
    return null;
  }
}
圧縮ダウンロードの制限および注意点
  • DEXTUploadX5は圧縮ダウンロードするための一連の作業過程を支援することで、独自のファイルを圧縮する機能を持っていない。
  • 圧縮ダウンロードは、サーバー側でファイルを圧縮する過程が存在する。ファイルを圧縮するのに必要とされる時間が長くなる場合、意図しない問題が発生することができる。

    ファイルを圧縮する作業は、サーバーのリソース(CPU、I / O)を大幅に消費する作業であるため、サイズが大きいファイルや圧縮ファイルの対象となるファイルの数が多い場合、サーバーにかなりのオーバーヘッドが発生するので、 、状況に応じて、ファイル圧縮処理を待っている時間が長くなることがあり、これは、セッションが途切れる問題がもたらさたり、サービス自体が停止される重大な問題につながることができる。したがって、圧縮のダウンロードをするための政策的制限を確立した後、機能を使用することをお勧めします。

    Javaの環境で使用するDEXTUploadNJサーバーコンポーネント製品は、圧縮処理のためにCompressUtilというクラスを提供し、このクラスは、Apache Commons Compressライブラリを使用する。詳細はDEXTUploadNJ製品マニュアルを参照している。

  • 圧縮がサーバーで実行中DEXTUploadX5は進行ウィンドウが表示されますが、圧縮されたファイルをダウンロードするときは、単一​​のファイルのダウンロードに移行されるので、ダウンロードプロセスの独自の進行状況ウィンドウは提供されない。
  • macOS Safariブラウザで圧縮ダウンロードを実行すると、ブラウザのポップアップブロック機能によりダウンロード処理が必要にしていないことがあります。したがって、サービスしようとするサイトのポップアップをブロックするSafariの設定を事前に解除する必要がある。

    macOS Safariブラウザは、ファイルをダウンロードした後、「安全なファイルを開く」機能により、zipファイルを解放しまうため、zipファイルのままダウンロードができない場合があります。もしzipファイルが自動的に解ける現象を防ぎたい場合、Safariの環境設定の[全般]タブで、その設定をチェック解除すればよい。