Vue プロジェクトはファイルダウンロードの進行状況バー機能を実装します

Vue プロジェクトはファイルダウンロードの進行状況バー機能を実装します

日常業務でファイルをダウンロードする一般的な方法は 2 つあります。

1 つ目は、サーバーのファイル アドレスに直接アクセスして、ファイルを自動的にダウンロードすることです。

2 番目の方法は、サーバーが BLOB ファイル ストリームを返し、それが処理されてダウンロードされるというものです。

一般的に、小さなファイルは、サーバー リソースをあまり占有しない最初のダウンロード ソリューションに適しています。大きなファイルの場合、図に示すように、ファイル ストリーミングが転送に使用されることがよくあります。

ファイル ストリームが正常に転送された後、次のコードを使用してブラウザをすぐに起動し、ファイル ストリームをダウンロードできます。

この方法にも欠点があります。ファイル ストリームの送信処理中、ユーザーはファイル ストリームの送信状態 (進行状況) を認識できないため、問題が発生する可能性があります (現在のダウンロード操作が有効になっているかどうかを判断できない)。この場合、ファイル ストリームの状態と転送の進行状況をページに表示して、ページの対話性と使いやすさを向上させることができます。

次に具体的な実装を示します。

カプセル化jsメソッド:

/**
 * @param {Object} データ: {url: ファイルアドレス、download: ファイル名}
 */
エクスポート関数downLoadAll(data) {
  失望させるProgress = {};
  let uniSign = new Date().getTime() + ''; // クリックすると、複数のファイルを連続してダウンロードできます。ここでは、ダウンロードされた各ファイルを区別するためにタイムスタンプが使用されています axios.get(
    データ.url、 
    { レスポンスタイプ: 'blob'、ヘッダー: { "Content-Type": "application/json; charset=utf-8" },
    onDownloadProgress (進行状況) {
      downProgress = Math.round(100 * progress.loaded / progress.total) // progress オブジェクトの loaded はダウンロードされた量、total は合計量を示します。パーセンテージを計算します herestore.commit('caseInformation/SET_PROGRESS', {path: uniSign, 'progress': downProgress}) // このダウンロードのファイル名とダウンロード進行状況をオブジェクトに結合し、vuex 状態管理を使用します}}).then( (res)=>{ // ファイル ストリームの転送が完了したら、ファイルのダウンロードを開始しますif(data.downLoad){
        jsFileDownload(res.data,data.downLoad+'.'+data.url.replace(/.+\./,"")); // jsFileDownLoad はファイル ストリームをダウンロードするために使用されます。ダウンロード プラグイン: npm i js-file-download、インポート: import jsFileDownLoad from 'js-file-download'
      } それ以外 {
        jsFileDownload(res.data、data.url.split('/')[data.url.split('/').length-1]);
      }
  }).catch((e)=>{
    this.$message.error('ファイルをダウンロードできません')
  })
}

ストア内のcaseInfomation.js:

...

定数状態 = {
  progressList: [], // ファイルのダウンロード進行状況リスト...
}

const 変異 = {
  SET_PROGRESS: (state, progressObj)=>{ // 進捗リストを変更する if(state.progressList.length){ // 進捗リストが存在する場合 if(state.progressList.find(item=>item.path == progressObj.path)){ // 上記のパスタイムスタンプは存在する唯一のものなので、進捗リストで現在の進捗オブジェクトを見つけた場合は state.progressList.find(item=>item.path == progressObj.path).progress = progressObj.progress // 現在の進捗オブジェクトの進捗を変更する
      }
    }それ以外{
      state.progressList.push(progressObj) // 現在の進捗リストは空で、ダウンロード タスクはありません。進捗オブジェクトを進捗配列に直接追加します。}
  },
  DEL_PROGRESS: (状態、プロパティ) => {
    state.progressList.splice(state.progressList.findIndex(item=>item.path == props), 1) // 進捗リスト内の進捗オブジェクトを削除します},
  ...
}

このページには、進行状況ポップアップ コード downLoadNotice.vue が表示されます。

<テンプレート>

</テンプレート>

<スクリプト>
  'vuex' から { mapState } をインポートします。

  エクスポートデフォルト{
    名前: 'downLoadNotice',
    計算: {
      ...mapState({
      'progressList': 状態 => state.caseInformation.progressList
    })
    },
    データ() {
      戻る {
        通知: {} // ダウンロード ファイルの進行状況ポップアップ ボックス オブジェクトを維持するために使用されます}
    },
    watch: { //進行状況リストを監視する progressList: {
        ハンドラ(n) {
          データ = JSON.parse(JSON.stringify(n)) とします。
          データ.forEach(アイテム => {
            const domList = [...document.getElementsByClassName(item.path)]
            if (domList.find(i => i.className == item.path)) { // ページに進捗状況オブジェクトのポップアップボックスがすでにある場合は、その進捗状況を更新します
              domList.find(i => i.className == item.path).innerHTML = item.progress + '%'
            } それ以外 {
              if (item.progress === null) { // ここでフォールトトレランス処理。バックエンド転送ファイルストリームがエラーを報告した場合、現在の進行状況オブジェクトを削除します。this.$store.commit('caseInformation/DEL_PROGRESS', item.path)
                戻る
              }// ページに進捗オブジェクトに対応するポップアップボックスがない場合は、ページに新しいポップアップボックスを作成し、通知するポップアップボックスオブジェクトを追加します。属性名は進捗オブジェクトのパス(前述のように、パスは一意です)、属性値は$notify(要素uiの通知コンポーネント)です。ポップアップボックスオブジェクトthis.notify[item.path] = this.$notify.success({
                // タイトル: '情報',
                危険なHTML文字列を使用する: true、
                メッセージ: `<p style="width: 100px;">ダウンロード中<span class="${item.path}" style="float: right">${item.progress}%</span></p>`, // ダウンロード率を表示します。クラス名は進行状況オブジェクトのパスです (後で進行状況率を更新しやすくするため)
                表示閉じる: false,
                期間: 0
              })
            }
            console.log(item.progress + '%', '-------------------------->')

            if (item.progress == 100) { // ダウンロードの進行状況が100%に達したら、ポップアップウィンドウを閉じて、notifyで保持されているポップアップウィンドウオブジェクトを削除します。this.notify[item.path].close()
              // this.notify[item.path] を削除します。上記の close() イベントは非同期です。ここで直接削除するとエラーが発生します。setTimeout を使用して、操作を非同期キューに追加します。setTimeout(() => {
                this.notify[item.path]を削除します
              }, 1000)
              this.$store.commit('caseInformation/DEL_PROGRESS', item.path) // caseInformation の状態の progressList にある進捗オブジェクトを削除します}
          })
        },
        深い: 本当
      }
    }
  }
</スクリプト>

<スタイルスコープ>

</スタイル>

上記のコードを mixins フォルダーにカプセル化し、mixins を使用してページにミックスすることができます。

ページ内でダウンロード操作をトリガーします:

ダウンロード(アイテム){
   失望させるData = {
      URL: `ipdoc${item.url}`,
      ダウンロード: item.fileName
   }
   this.$commonUtils.downLoadAll(downData) // ダウンロード},

最終的なページの効果:

最後に、上記のダウンロードの進行状況は、実際にダウンロードされたファイルではなく、ファイル ストリームであることに注意してください。ファイル ストリームがダウンロードされた後、上記の js-file-download プラグインを通じて実際のファイルをダウンロードできます。

これで、vue プロジェクトでファイル ダウンロード プログレス バーを実装する方法に関するこの記事は終了です。vue ファイル ダウンロード プログレス バーに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vueはドラッグプログレスバーを実装します
  • Vue で円形プログレスバーを実装する例
  • vue.js+ElementUI はパスワードの強度を促すプログレスバーの効果を実現します
  • Vue ページの読み込み時の進捗バー機能 (サンプル コード)
  • 循環読み込みプログレスバーのカプセル化 (Vue プラグイン バージョンとネイティブ js バージョン)
  • Vueはnprogressを設定してページ上部にプログレスバーを実装します。
  • Vue で NProgress プログレスバーを使用する方法

<<:  Nginx で HTTPS 証明書を構成する詳細なプロセス

>>:  MySQL 関数インデックス最適化ソリューション

推薦する

CentOSにPHP+Apache+MySQLのサーバー環境をインストールして構築する

Yum (フルネームは Yellow dog Updater, Modified) は、Fedora...

Alibaba Cloud ECS サーバーでポート 8080 を開く方法

セキュリティ上の理由から、Alibaba Cloud Server ECS にはデフォルトで独自のセ...

ウェブページのエクスペリエンス: ウェブページのカラーマッチング

<br />ウェブページの色はウェブサイトのイメージを確立する鍵の一つですが、ネットユー...

純粋なCSSでデジタルプラスとマイナスボタンを実装するための最適なソリューション

序文:デジタル加算ボタンと減算ボタンの実装には、次のような多くのソリューションがこれまでに使用されて...

HTML 特殊文字変換表

キャラクター小数点文字番号エンティティ名---未使用空間---スペースバー! ! ---感嘆符「 」...

Linux で環境変数 JAVA_HOME を変更/設定する方法について簡単に説明します。

1. 永久的な変更、すべてのユーザーに有効# vi /etc/プロファイル//キーボードの[Shi...

Linux システムの /etc/fstab ファイルの詳細な解釈

序文 [root@localhost ~]# cat /etc/fstab # #/etc/fsta...

ウィンドウ内のさまざまな距離/スクロール距離の正確な計算の概要

通常、プロジェクト開発では、マージン、位置、座標などを扱う必要があります。悲劇なのは、これらの概念が...

Vueテクノロジーに基づく再帰コンポーネントの実装方法

説明するこの記事では、Vue テクノロジーに基づいて再帰コンポーネントを実装する方法を紹介します。 ...

Dockerデータ管理とネットワーク通信の使用

Docker をインストールし、Docker コアとインストールを通じて簡単な操作を実行できます。 ...

Vueスロットの実装原理についての簡単な説明

目次1. サンプルコード2. 現象を通して本質を見抜く3. 実施原則4. 親コンポーネントのコンパイ...

MySQL のユニークインデックスと通常のインデックスのどちらを選択すればよいでしょうか?

ユーザー テーブルを設計するときに、各人の ID 番号が一意であり、検索する必要があるシナリオを想像...

MySQL5.7.17 winx64 インストール バージョン構成方法 Windows Server 2008 R2 でのグラフィック チュートリアル

参考までに、Winでmysql5.7をインストールします。具体的な内容は次のとおりです。 @Auth...

要素の$notifyポイントについての簡単な説明

当初の意図は、element-ui の $notify 通知をコンポーネントにカプセル化することでし...

MySQL SHOW STATUSステートメントの使用

MySQL のパフォーマンス調整とサービス ステータスの監視を行うには、MySQL の現在の実行状態...