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 関数インデックス最適化ソリューション

推薦する

Ubuntu 19.10 で ssh サービスを有効にする (詳細なプロセス)

Ubuntuでsshを開くのに1時間以上かかりました。主な原因は、最初に読んだチュートリアルの手順...

CSS を使用して複数の方法で等幅レイアウトを実装するサンプルコード

この記事で説明する等幅レイアウトでは、純粋な CSS を使用して、要素の幅を手動で設定することなく、...

jQueryはテーブル行データのスクロール効果を実現します

この記事の例では、テーブル行データのスクロール効果を実現するためのjQueryの具体的なコードを参考...

VirtualBox を使用して Linux クラスターをシミュレートする方法

1. ホストMacbookにHOSTをセットアップする前回のドキュメントでは仮想マシンの静的 IP ...

カルーセルの制作方法を実現するjs

この記事では、カルーセル画像の表示を実現するためのjsの具体的なコードを参考までに共有します。具体的...

Innodb システムテーブルスペースのメンテナンス方法

環境説明:実行中の MySQL 環境があります。以前の構成ファイルの設定が単純すぎたため (inno...

純粋な CSS3 を使用して、円の動的な光る特殊効果アニメーションを実装するためのサンプル コード

この記事では、主に、円形のダイナミックな光る特殊効果アニメーションを実現するための純粋な CSS3 ...

タブ切り替え効果を実現するJavaScript

この記事では、タブ切り替え効果を実現するためのJavaScriptの具体的なコードを参考までに紹介し...

IdeaはリモートDockerをデプロイし、ファイルを構成する

1. LinuxサーバーのDocker構成ファイルを変更する vim /usr/lib/system...

Expressはログイン認証を実装

この記事では、ログイン認証を実装するためのExpressの具体的なコードを例として紹介します。具体的...

Redis を Docker コンテナとして素早くデプロイする方法

目次はじめるデータストレージサーバーを構成するRedis セキュリティの管理Redisインストールの...

Vueフロントエンドの効率的な開発のためのレンダリング手順をリストします

v-for ディレクティブリストといえば、ループについても触れなければなりません。v-for 命令は...

Centos で MySQL パスワードを変更する方法

1. MySQL ログイン設定を変更します。 # vim /etc/my.cnf文を追加: skip...

JavaScript イベントバブリング、イベントキャプチャ、イベント委任の詳細な説明

1. イベントバブリング: JavaScript イベント伝播のプロセスでは、要素でイベントがトリガ...

Dockerコンテナデータボリュームの原理と使用法の分析

コンテナデータボリュームとはデータがコンテナ内にある場合、コンテナを削除するとデータは失われます。例...