この記事では主に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 イメージをプルするのが遅すぎる問題を解決する
<br />一般的なゲストブック、フォーラムなどでは、テキスト入力ボックスが使われていま...
現在のスクロール オフセットを html 要素の属性に追加することで、現在のスクロール位置に基づいて...
私の開発環境は、VMWare 仮想マシンに CentOS をインストールし、ホスト ファイルにインタ...
ここでは、通常ヘッダーとフッターに対して行われるインクルード ファイルを使用している可能性があります...
<br />最近、UCDChina は「インターフェース上のテキストに注意を払う」という...
別のライブラリから別のライブラリにデータをインポートする必要がある場合があり、このデータは CSV ...
問題の説明最近、Springbootプロジェクトを構築していたところ、会社のネットワークケーブルに接...
序文MySQL 8.0 の最新バージョンは 8.0.4 rc であり、正式版は近日中にリリースされる...
ソフトウェア パッケージが存在しない場合は、インストールされているソフトウェアのソフトウェア ソース...
123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...
ここでは、samba (ファイル共有サービス) v4.9.1 + OPENldap (バックエンド ...
<table id=" <%=var1%>">、var1...
結果:実装コード: html <link href='https://fonts.go...
MySQL-8.0.23 をダウンロードクリックしてダウンロード: mysql-8.0.23-li...
最新の Ubuntu Server バージョンを使用している場合、ようこそメッセージに、Ubuntu...