この記事では主に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 を応援してください。 以下もご興味があるかもしれません:
|
>>: Docker が MySQL イメージをプルするのが遅すぎる問題を解決する
Alibaba Cloud セキュリティグループの概要Alibaba Cloud Server セ...
この記事では、VMware仮想マシンのNAT構成プロセスを詳しく説明します。具体的な内容は次のとおり...
Docker をインストールし、Docker コアとインストールを通じて簡単な操作を実行できます。 ...
docker パッケージング Python 環境の手順は次のとおりです。 1 pip listの下に...
目次Tomcat8のインストールと設定方法tomcat ダウンロードTomcat マネージャーを有効...
HTML はタグと属性で構成されており、これらを組み合わせてブラウザにページの表示方法を指示します。...
この記事では、参考までに、Navicatを使用してCSVファイルをMySQLにインポートするための具...
昨日、1年間使用していた Alibaba Cloud サーバーを購入しました。システムは Linux...
目次問題の概要問題の再現問題の拡大結論は問題の概要今日、仕事中に、DBA が突然、SQL に暗黙的な...
目次1. 手ぶれ補正機能とは何ですか? 1. なぜ手ぶれ補正機能が必要なのでしょうか? 2. 手ぶれ...
導入MySQL InnoDB エンジンがレコードをクエリし、インデックス カバレッジを使用できない場...
CSSでtext-align、margin: 0 autoを使用して中央揃えにするtext-alig...
Linux で Ctrl+c、Ctrl+d、Ctrl+z はどういう意味ですか? Ctrl+c と ...
オーディオおよびビデオ ファイルを保存するためのディスク寿命を延ばすには、ディスクをフォーマットする...
この記事では、参考までに、無限ロードウォーターフォールフローを実現するためのVueの具体的なコードを...