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

推薦する

HTMLタグの説明

HTMLタグの説明1. HTMLタグタグ: !DOCTYPE説明: HTML ドキュメントが準拠する...

シンプルな商品スクリーニング機能を実現するjs

この記事の例では、商品スクリーニング機能を実装するためのjsの具体的なコードを参考までに共有していま...

Nginx レイヤー 4 負荷分散構成ガイド

1. レイヤー4負荷分散の概要レイヤー 4 ロード バランシングとは何ですか?いわゆる 4 層負荷分...

フロントエンドページのスライド検証を実装するための JavaScript + HTML (2)

この記事の例では、クールなフロントエンドページのスライド検証の具体的なコードを参考までに共有していま...

MySQL で単一のデータベースまたはテーブルを復元する方法と、起こりうる落とし穴

序文:最も一般的に使用される MySQL 論理バックアップ ツールは mysqldump です。通常...

Angularコンポーネントの仲介モードの詳細な説明

目次1. 仲介業者モデル2. 例1. 見積コンポーネントに購入ボタンを追加する2. 親コンポーネント...

CentOS で LibreOffice を使用してドキュメント形式を変換する方法

プロジェクト要件では、アップロードされたドキュメントの前処理が必要です。ユーザーが doc 形式でド...

PSSHを使用してLinuxサーバーを一括管理する

pssh は、多数のマシンでのバッチ ssh 操作に使用される、Python で実装されたオープン ...

Ant Design Blazor コンポーネントライブラリのルーティング再利用マルチタブ機能

最近、Ant Design Blazor コンポーネント ライブラリにマルチタブ コンポーネントを実...

Mysql は非集計列を選択できません

1. はじめに最近ブログをアップグレードし、記事ページの下部に前の記事と次の記事に直接ジャンプできる...

パフォーマンス負荷診断にMySQLシステムデータベースを使用する方法

ある達人がかつて、自分の妻のことを知るのと同じくらい、自分が管理するデータベースのことを知るべきだと...

JavaScript でカウントダウン効果を実装する

カウントダウン効果を実現するにはJavascriptを使用します。参考までに、具体的な内容は次のとお...

JavaScript スクリプトが実行されるタイミングの詳細な説明

JavaScript スクリプトは HTML 内のどこにでも埋め込むことができますが、いつ呼び出され...

フレックスマルチカラムレイアウトで発生する問題と解決策の詳細な説明

フレックス レイアウトは間違いなくシンプルで使いやすいです。レイアウトをよりシンプルかつ高速にします...

Windows で MySQL のルート パスワードを忘れた場合にリセットする方法

私のマシン環境: Windows 2008 R2 MySQL 5.6 Baidu で「Windows...