www.dextsolution.com
DEXTUPLOAD
X5
製品の説明 > 圧縮ダウンロード（ASP Classic）

# 圧縮ダウンロード（ASP Classic）

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

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

サーバーは、ファイルを圧縮することができる機能を持っている必要がありますが、いくつかの圧縮ライブラリを使って機能を実装することができますが、ASP環境であれば、ファイル圧縮のダウンロードを一緒にサポートしているDEXTUpload Professional製品を使用することもできる。（4.1.0.0以降で圧縮機能をサポートしている。）

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

  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.asp");
      }

ボタンの接続

  仮想ファイルと圧縮ダウンロードパスの設定が完了したら、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>

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

サーバー側の処理（ASP Classic + DEXTUpload Professional）

  compress.aspでDEXTProCompressorオブジェクトを使用して圧縮タスクを処理することができる。

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

      'DEXTUploadX5_VIndexesフォーム名から圧縮する対象の仮想インデックスのセットを得ることができる。
      vindexes = Split(GetFormString("DEXTUploadX5_VIndexes", "", true), ",")
      '圧縮ファイルを作成するフォルダのパスである。
      tempFolder = Request.ServerVariables("APPL_PHYSICAL_PATH") & "files\temp\"
      '元のファイルがあるフォルダのパスである。
      defaultFolder = Request.ServerVariables("APPL_PHYSICAL_PATH") & "files\attach\"
      set fs = Server.CreateObject("Scripting.FileSystemObject")
      '圧縮のためのDEXTProCompressorオブジェクトを生成する。
      set compressor = Server.CreateObject("DEXT.DEXTProCompressor")
      '圧縮レベルを設定する。zip形式の圧縮でのみ有効である。
      '0〜9の間の値を使用する。未指定時のデフォルトの圧縮レベル（-1）が使用される。
      compressor.CompLevel = -1

      '圧縮する対象をDEXTProCompressorオブジェクトに追加をする。
      '圧縮ファイルの名前は、オブジェクトに最初に追加されるファイルの名前に従うようにする。
      for i = 0 to ubound(vindexes)
          '開くターゲットを設定する。
          if vindexes(i) = "IDX0003" then
              set file = fs.GetFile(defaultFolder & "bridge_509147.jpg")
          elseif vindexes(i) = "IDX0004" then
              set file = fs.GetFile(defaultFolder & "beach_239826.jpg")
          elseif vindexes(i) = "IDX0005" then
              set file = fs.GetFile(defaultFolder & "cosmos (empty space) 195779.jpg")
          else
              set file = nothing
          end if
          if not file is nothing then
              compressor.AddFile(file.Path)
              if compressor.Count = 1 then
                  '圧縮ファイル形式に応じて、生成経路設定
                  'zip、7z二つの圧縮形式をサポートする。
                  'zip、7z以外の拡張子を指定する際、zip形式で処理される。
                  compressor.CompFileSavePath = tempFolder & GetFileNameWithoutExtension(file.Name) & ".zip"
              end if
          end if
          set file = nothing
      next
      if compressor.Count > 0 then
          'の圧縮を実行する。
          compressedPath = compressor.Compress(true)
          set file = fs.GetFile(compressedPath)
          Response.ContentType = CONTENT_TYPE_TEXTPLAIN
          Response.CharSet = UTF8_CHARSET
          Response.Clear()
          'の例ではなく、実際の状況では、セッションやデータベースなどの他のストレージ方式を利用して、
          '実際にダウンロードを実行する必要がページ（zip-download.asp）で圧縮ファイルのパスを取得することができるよう処理しなければならない。
          'しかし、例では、圧縮ファイルの名前を照会ストリングにダウンロードアドレスを応答データに記録してDEXTUploadX5が受けられるようにする。
          Response.Write(GetProtocolFromURL() & "://" & GetDomainFromURL() & ":" & GetPortFromURL() & _
              "/service/zip-download.asp?name=" & Replace(Server.UrlEncode(file.Name), "+", "%20"))
          set file = nothing
      else
          Response.AppendToLog("Targets for zip not found")
          Response.Status = HTTP_FILE_NOT_FOUND_ERR
      end if

      set compressor = nothing
      set fs = nothing

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

      fileName = GetQueryString("name", "", true)
      tempFolder = Request.ServerVariables("APPL_PHYSICAL_PATH") & "files\temp\"
      set fs = Server.CreateObject("Scripting.FileSystemObject")
      '圧縮ファイルを表すオブジェクトを得る。
      set file = fs.GetFile(tempFolder & fileName)
      if file is nothing then
          Response.AppendToLog("Zip file not found")
          Response.Status = HTTP_FILE_NOT_FOUND_ERR
      else
          'DEXTUpload Pro FileDownloadオブジェクトの作成
          set oDextpro = Server.CreateObject("DEXT.FileDownload")
          'ファイルのダウンロードを開始する。
          oDextpro.Download file.Path, file.Name, true, false
          'クライアントにファイルをダウンロードし送ってほしい圧縮ファイルを削除する。
          fs.DeleteFile(file.Path)
          set oDextpro = nothing
          'が裏Response.Writeを使用して、他の値を出力するべきでない。
      end if
      set file = nothing
      set fs = nothing

圧縮ダウンロードの制限および注意点
  - DEXTUploadX5は圧縮ダウンロードするための一連の作業過程を支援することで、独自のファイルを圧縮する機能を持っていない。

  - 圧縮ダウンロードは、サーバー側でファイルを圧縮する過程が存在する。ファイルを圧縮するのに必要とされる時間が長くなる場合、意図しない問題が発生することができる。

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

  - 圧縮がサーバーで実行中DEXTUploadX5は進行ウィンドウが表示されますが、圧縮されたファイルをダウンロードするときは、単一​​のファイルのダウンロードに移行されるので、ダウンロードプロセスの独自の進行状況ウィンドウは提供されない。

  - macOS Safariブラウザで圧縮ダウンロードを実行すると、ブラウザのポップアップブロック機能によりダウンロード処理が必要にしていないことがあります。したがって、サービスしようとするサイトのポップアップをブロックするSafariの設定を事前に解除する必要がある。

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