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 イメージをプルするのが遅すぎる問題を解決する

推薦する

ウェブデザインにおけるテキスト入力ボックスのパラメータの説明

<br />一般的なゲストブック、フォーラムなどでは、テキスト入力ボックスが使われていま...

スマートCSSを使用して、ユーザーのスクロール位置に基づいてスタイルを適用します。

現在のスクロール オフセットを html 要素の属性に追加することで、現在のスクロール位置に基づいて...

CentOS7仮想マシンで固定IPアドレスを設定する方法

私の開発環境は、VMWare 仮想マシンに CentOS をインストールし、ホスト ファイルにインタ...

Unicode署名BOMによる事故原因の分析

ここでは、通常ヘッダーとフッターに対して行われるインクルード ファイルを使用している可能性があります...

体験をデザインする: ボタンには何があるか

<br />最近、UCDChina は「インターフェース上のテキストに注意を払う」という...

MySql インポート CSV ファイルまたはタブ区切りファイル

別のライブラリから別のライブラリにデータをインポートする必要がある場合があり、このデータは CSV ...

アイデアを使用して Springboot 初期化サーバーを構築する際の問題分析

問題の説明最近、Springbootプロジェクトを構築していたところ、会社のネットワークケーブルに接...

MySQL 8.0 の新しいリレーショナル データベース機能の詳細な説明

序文MySQL 8.0 の最新バージョンは 8.0.4 rc であり、正式版は近日中にリリースされる...

Linux にソフトウェアをインストールするときにソフトウェア パッケージが存在しない問題を解決する方法

ソフトウェア パッケージが存在しない場合は、インストールされているソフトウェアのソフトウェア ソース...

HTML マークアップ言語 - テーブルタグ

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

ファイル共有サーバーを構築するための samba + OPENldap の詳細な説明

ここでは、samba (ファイル共有サービス) v4.9.1 + OPENldap (バックエンド ...

HTMLタグIDは変数にできる

<table id=" <%=var1%>">、var1...

CSS3 で作成したホバーズーム効果

結果:実装コード: html <link href='https://fonts.go...

Ubuntu Server のターミナルのウェルカム メッセージで広告を無効にする方法

最新の Ubuntu Server バージョンを使用している場合、ようこそメッセージに、Ubuntu...