Vue+element+springboot でファイルダウンロードの進行状況バー表示機能を実装する例

Vue+element+springboot でファイルダウンロードの進行状況バー表示機能を実装する例

この記事では主にvue+element+springbootを使ってファイルダウンロードプログレスバー表示機能を実現した例を紹介し、皆さんと共有します。詳細は以下の通りです。

最終レンダリング

1. 需要背景

最近、最適化のリクエストを受け取りました。元のシステムファイルのダウンロード機能は、特に時間のかかるファイルをダウンロードするときにユーザーフレンドリーではありませんでした。ユーザーはダウンロードの進行状況を知らずにページで待機し、システムが停止していると思っていました。

2. 最適化計画

バックグラウンドでダウンロード速度を最適化します(断片化されたダウンロードについては調べることができますが、ここでは詳しく説明しません)
フロントエンドのユーザー エクスペリエンスを向上させる (たとえば、ダウンロードをクリックした後、ダウンロードが進行中であることを顧客に知らせるために進行状況を表示する必要がある)

3. 具体的な実施

ここでは、フロントエンドのユーザー エクスペリエンスを変革するために、2.2 のソリューションを選択しました。この記事を書く目的は、当時のソリューション プロセスを記録し、皆さんのお役に立てればと思っています。この記事で使用したソリューションの技術的背景: フロントエンド: vue + element-ui、バックエンド: springboot フロントエンドとバックエンドの分離、これ以上面倒なことはせずに、コードに直接記載します。

3.1 フロントエンドコード

1. ポップアップレイヤーを定義します(スタイルは好みに応じて決定できます)

<!--ダウンロード進捗バー-->
    <el-dialog title="ダウンロード中です。お待​​ちください" :visible.sync="fileDown.loadDialogStatus" :close-on-click-modal="false" 
      :close-on-press-escape="false" :show-close="false" width="20%">
      <div style="text-align: center;">
        <el-progress type="circle" :percentage="fileDown.percentage"></el-progress>
      </div>
      <div スロット="フッター" クラス="ダイアログ フッター">
        <el-button type="primary" @click="downClose">ダウンロードをキャンセル</el-button>
      </div>  
    </el-ダイアログ>

data() でオブジェクトを定義する

ファイルダウン: {
        loadDialogStatus: false, // ポップアップ ボックス コントロールのステータス percentage: 0, // 進行状況バーのパーセンテージ source: {}, // ダウンロード リソース オブジェクトのキャンセル },

3. メインメソッド(以下のパラメータ、バックグラウンドアドレス、ファイル名などを置き換えることに注意してください)

ダウンファイル(行) {
    //ここにパラメータを入力します var param = {};
    this.fileDownloadDialogStatus = true; です。
    this.fileDown.percentage = 0;
    定数インスタンス = this.initInstance();
    実例({
        メソッド: "post",
        資格情報: true、
        url: "ダウンロードアドレスを置き換える",
        パラメータ: パラメータ、
        レスポンスタイプ: "blob"
    }).then(res => {
        this.fileDown.loadDialogStatus = false;
        コンソール.info(res);
        定数コンテンツ = res.data;
        コンテンツサイズが0の場合
          this.loadClose();
          this.$alert("ダウンロードに失敗しました");
          戻る ;
        }
        const blob = 新しい Blob([コンテンツ]);
        const fileName = row.fileName; //ファイル名を置き換えます if ("download" in document.createElement("a")) {
          // IE 以外のダウンロード const elink = document.createElement("a");
          elink.download = ファイル名;
          elink.style.display = "なし";
          elink.href = URL.createObjectURL(blob);
          document.body.appendChild(elink);
          elink.click();
          setTimeout(関数() {
            URL.revokeObjectURL(elink.href); // URL オブジェクトを解放します document.body.removeChild(elink);
          }, 100);
        } それ以外 {
          // IE10+ ダウンロード navigator.msSaveBlob(blob, fileName);
        }
      }).catch(エラー => {
          this.fileDown.loadDialogStatus = false;
          console.info(エラー);
      });
  },
インスタンスの初期化() {
      var _this = これ;
      //キャンセル用のリソース トークン this.fileDown.source = axios.CancelToken.source();
      const instance = axios.create({ //axios オブジェクトは事前にインポートするか、グローバルに定義された onDownloadProgress: function(ProgressEvent) に置き換える必要があります {
          ProgressEvent をロードします。
          ProgressEvent の戻り値は 0 です。
          const 進捗状況 = (負荷 / 合計) * 100;
          console.log('進行状況='+進行状況);
          // 計算は既に開始時に行われています。続行するには、前回の計算を超える必要があります if (progress > _this.fileDown.percentage) {
            _this.fileDown.percentage = Math.floor(進行状況);
          }
          進捗状況が100の場合
            //ダウンロードが完了しました_this.fileDown.loadDialogStatus = false;
          }
        },
        cancelToken: this.fileDown.source.token, //キャンセルリクエストトークンを宣言する
      });
      インスタンスを返します。
    },
    ダウンクローズ() {
      //ダウンロードを中断します this.$confirm("[閉じる] をクリックするとダウンロードが中断されます。閉じてもよろしいですか?", this.$t("button.tip"), {
        確認ボタンテキスト: this.$t("button.confirm"),
        キャンセルボタンテキスト: this.$t("button.cancel"),
        タイプ: 「警告」
      }).then(() => {
          //ダウンロード コールバックを中断します this.fileDown.source.cancel('log==顧客が手動でダウンロードをキャンセルしました');
      }).catch(() => {
          //キャンセル -- 何もしない});      
    },

3.2 背景コード

バックグラウンドの主な目的は、計算されたファイル サイズを返すことです。そうしないと、フロントエンドが進行状況を計算するときに取られる合計は常に 0 になり、これが隠れた落とし穴となります。
キーコード: (インターネット上で完全な背景をダウンロードする方法はたくさんありますが、ここでは重要なポイントと注意が必要なポイントだけを示します)

//ローカル ファイルを取得してサイズを計算します。File file = new File(zipFileName);//圧縮されたファイルを読み取ります。InputStream inputStream = new FileInputStream(file);
int totalSize = inputStream.available(); // ファイル サイズを取得します。logger.info("圧縮後 === 現在のファイルのダウンロード サイズ size={}", totalSize);
response.setHeader("Content-Length", totalSize+""); //response.getOutputStream() の前に setHeader プロパティを設定する必要があることに注意してください。そうしないと、有効になりません。OutputStream out = response.getOutputStream();
その後の省略...

4. 結論

使用中に別の問題が発生する可能性があります。つまり、バックエンドでファイル サイズの計算に時間がかかり、フロントエンドの進行状況バーが長時間動かなくなり、ユーザーは依然として行き詰まったように感じ、これはニーズを満たしません。

ここでの私の解決策は、フロントエンドにタイマーを作ることです。ダウンロードをクリックすると、最初にタイマーが実行され、たとえば、2 秒で進行状況が 1% 増加します。バックグラウンドによって合計ファイル サイズが返されたときに、計算されたパーセンテージ (パーセント) がタイマーのパーセンテージ (パーセント) を超えると、タイマーをオフにして、進行状況パーセンテージの属性 (パーセント) を置き換えます。このタイマーの自動パーセンテージ増加 (パーセント) には上限がある必要があることに注意してください。
利点は、ユーザーがダウンロードボタンをクリックすると、フロントエンドが応答することです。前の応答が偽である可能性がありますが、接続が良好である限り、真であるか偽であるかは問題ではありません。

これで、vue+element+springboot を使用してファイル ダウンロード プログレス バー表示機能の例を実装するこの記事は終了です。関連する element springboot ダウンロード プログレス バーのコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援してください。

以下もご興味があるかもしれません:
  • SpringBoot でリアルタイムに更新されるプログレスバーを実装する方法
  • 進捗バー付きの Springboot アップロード機能の完全な例

<<:  6つの珍しいHTMLタグ

>>:  Docker が MySQL イメージをプルするのが遅すぎる問題を解決する

推薦する

VMware 仮想マシンの NAT モードを構成する方法

この記事では、VMware仮想マシンのNAT構成プロセスを詳しく説明します。具体的な内容は次のとおり...

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

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

DockerでPython環境をパッケージ化するプロセスの詳細な説明

docker パッケージング Python 環境の手順は次のとおりです。 1 pip listの下に...

Tomcat の設定と Eclipse での起動方法

目次Tomcat8のインストールと設定方法tomcat ダウンロードTomcat マネージャーを有効...

はじめに: HTML の基本的なタグと属性の簡単な紹介

HTML はタグと属性で構成されており、これらを組み合わせてブラウザにページの表示方法を指示します。...

Navicat を使用して csv ファイルを MySQL にインポートする

この記事では、参考までに、Navicatを使用してCSVファイルをMySQLにインポートするための具...

Alibaba Cloud ECS クラウド サーバー (Linux システム) は、MySQL をインストールした後にリモートで接続できません (落とし穴)

昨日、1年間使用していた Alibaba Cloud サーバーを購入しました。システムは Linux...

MySQLの整数および文字列インデックスの無効化または暗黙的な変換に関する簡単な説明

目次問題の概要問題の再現問題の拡大結論は問題の概要今日、仕事中に、DBA が突然、SQL に暗黙的な...

JS 手ぶれ補正機能の実装と使用シナリオ

目次1. 手ぶれ補正機能とは何ですか? 1. なぜ手ぶれ補正機能が必要なのでしょうか? 2. 手ぶれ...

MySQL テーブルを返すとインデックスが無効になるケースの説明

導入MySQL InnoDB エンジンがレコードをクエリし、インデックス カバレッジを使用できない場...

CSS で text-align と margin: 0 auto を使用して中央に配置する例コード

CSSでtext-align、margin: 0 autoを使用して中央揃えにするtext-alig...

Linux コマンドにおける Ctrl+z、Ctrl+c、Ctrl+d の違いと使い方

Linux で Ctrl+c、Ctrl+d、Ctrl+z はどういう意味ですか? Ctrl+c と ...

Linux システムの busybox に mkfs.vfat コマンドを移植する

オーディオおよびビデオ ファイルを保存するためのディスク寿命を延ばすには、ディスクをフォーマットする...

Vue は無限ロードウォーターフォールフローを実装します

この記事では、参考までに、無限ロードウォーターフォールフローを実現するためのVueの具体的なコードを...