Vue+Element+Springboot zum Implementieren eines Beispiels für die Anzeigefunktion des Fortschrittsbalkens beim Dateidownload

Vue+Element+Springboot zum Implementieren eines Beispiels für die Anzeigefunktion des Fortschrittsbalkens beim Dateidownload

In diesem Artikel wird hauptsächlich das Beispiel von vue + element + springboot vorgestellt, um die Funktion zur Anzeige des Fortschrittsbalkens beim Herunterladen von Dateien zu realisieren, und es wird mit Ihnen geteilt. Die Details sind wie folgt

Endgültiges Rendering

1. Nachfragehintergrund

Kürzlich erhielten wir eine Optimierungsanfrage. Die ursprüngliche Datei-Download-Funktion des Systems war nicht benutzerfreundlich, insbesondere beim Herunterladen einiger zeitaufwändiger Dateien. Benutzer warteten auf der Seite, ohne den Download-Fortschritt zu kennen, und dachten immer, das System sei hängengeblieben.

2. Optimierungsplan

Optimieren Sie die Downloadgeschwindigkeit im Hintergrund (Sie können fragmentierte Downloads untersuchen, aber ich werde hier nicht näher darauf eingehen)
Verbessern Sie die Benutzererfahrung im Front-End (Sie müssen beispielsweise nach dem Klicken auf „Herunterladen“ den Fortschritt anzeigen, um den Kunden darüber zu informieren, dass der Download ausgeführt wird).

3. Konkrete Umsetzung

Hier wählen wir die Lösung in 2.2, um das Front-End-Benutzererlebnis zu verändern. Der Zweck dieses Artikels besteht darin, den damaligen Lösungsprozess aufzuzeichnen, in der Hoffnung, allen zu helfen; der technische Hintergrund der in diesem Artikel verwendeten Lösung: Front-End Vue + Element-UI, Back-End: Springboot-Front-End und Back-End-Trennung, ohne weiteres direkt im Code;

3.1 Front-End-Code

1. Definieren Sie eine Popup-Ebene (der Stil kann nach Ihren eigenen Vorlieben bestimmt werden)

<!--Download-Fortschrittsbalken-->
    <el-dialog title="Wird heruntergeladen, bitte warten" :visible.sync="fileDown.loadDialogStatus" :close-on-click-modal="false" 
      :schließen beim Drücken von Escape="false" :anzeigen-schließen="false" width="20%">
      <div Stil="Textausrichtung: Mitte;">
        <el-progress Typ="Kreis" :percentage="fileDown.percentage"></el-progress>
      </div>
      <div slot="Fußzeile" class="dialog-footer">
        <el-button type="primary" @click="downClose">Download abbrechen</el-button>
      </div>  
    </el-dialog>

Definieren Sie ein Objekt in data()

DateiDown: {
        loadDialogStatus: false, // Prozentsatz des Steuerelementstatus des Popup-Fensters: 0, // Prozentsatz der Fortschrittsanzeige, Quelle: {}, // Download des Ressourcenobjekts abbrechen },

3. Hauptmethode (Beachten Sie, dass die folgenden Parameter ersetzt werden müssen: Hintergrundadresse, Dateiname usw.)

downFile(Zeile) {
    //Parameter hier einfügen var param = {};
    this.fileDown.loadDialogStatus = true;
    this.fileDown.percentage = 0;
    const Instanz = this.initInstance();
    Beispiel({
        Methode: "post",
        mit Anmeldeinformationen: true,
        url: "Downloadadresse ersetzen",
        Parameter: Parameter,
        Antworttyp: „Blob“
    }).dann(res => {
        this.fileDown.loadDialogStatus = falsch;
        konsole.info(res);
        const Inhalt = res.data;
        wenn (Inhaltsgröße == 0) {
          dies.loadClose();
          this.$alert("Download fehlgeschlagen");
          zurückkehren ;
        }
        const blob = neuer Blob([Inhalt]);
        const fileName = row.fileName; //Ersetze den Dateinamen if ("download" in document.createElement("a")) {
          // Nicht-IE-Download const elink = document.createElement("a");
          elink.download = Dateiname;
          elink.style.display = "keine";
          elink.href = URL.createObjectURL(blob);
          Dokument.Body.AnhängenUntergeordnetesElement(elink);
          elink.klick();
          setzeTimeout(Funktion() {
            URL.revokeObjectURL(elink.href); // URL-Objekt freigeben document.body.removeChild(elink);
          }, 100);
        } anders {
          // IE10+ herunterladen navigator.msSaveBlob(blob, fileName);
        }
      }).fangen(Fehler => {
          this.fileDown.loadDialogStatus = falsch;
          konsole.info(Fehler);
      });
  },
initInstance() {
      var _this = dies;
      //Ressourcentoken für Stornierung this.fileDown.source = axios.CancelToken.source();
      const instance = axios.create({ //Das Axios-Objekt sollte vorab importiert oder durch Ihr global definiertes onDownloadProgress ersetzt werden: function(ProgressEvent) {
          const load = ProgressEvent.loaded;
          const total = Fortschrittsereignis.total;
          const Fortschritt = (Last / Gesamt) * 100;
          console.log('Fortschritt='+Fortschritt);
          // Die Berechnung wurde bereits am Anfang durchgeführt. Dies muss die vorherige Berechnung überschreiten, um fortzufahren, wenn (Fortschritt > _this.fileDown.percentage) {
            _this.fileDown.percentage = Math.floor(Fortschritt);
          }
          wenn(Fortschritt == 100){
            //Download abgeschlossen_diese.DateiDown.loadDialogStatus = false;
          }
        },
        cancelToken: this.fileDown.source.token, //Deklariert ein Token für die Abbruchanforderung
      });
      Instanz zurückgeben;
    },
    runterSchließen() {
      //Download unterbrechen this.$confirm("Wenn Sie auf Schließen klicken, wird der Download unterbrochen. Möchten Sie ihn wirklich schließen?", this.$t("button.tip"), {
        Bestätigungsschaltflächentext: this.$t("button.confirm"),
        cancelButtonText: dies.$t("button.cancel"),
        Typ: „Warnung“
      }).then(() => {
          //Download-Rückruf unterbrechen this.fileDown.source.cancel('log==Kunde hat Download manuell abgebrochen');
      }).catch(() => {
          //Abbrechen – nichts tun});      
    },

3.2 Hintergrundcode

Der Hauptzweck des Hintergrunds besteht darin, die berechnete Dateigröße zurückzugeben. Andernfalls beträgt die Gesamtsumme, die beim Berechnen des Fortschritts durch das Front-End ermittelt wird, immer 0, was eine versteckte Falle darstellt.
Schlüsselcode: (Es gibt viele Möglichkeiten, den vollständigen Hintergrund im Internet herunterzuladen. Hier sind nur die wichtigsten Punkte und Punkte, die beachtet werden müssen.)

//Lokale Datei abrufen und Größe berechnen. Datei: file = new File(zipFileName);//Komprimierte Datei lesen. InputStream: inputStream = new File. InputStream(file);
int totalSize = inputStream.available(); //Dateigröße abrufen logger.info("Nach der Komprimierung === aktuelle Downloadgröße der Datei size={}", totalSize);
response.setHeader("Content-Length", totalSize+""); //Beachten Sie, dass Sie die setHeader-Eigenschaft vor response.getOutputStream() festlegen müssen, da sie sonst nicht wirksam wird. OutputStream out = response.getOutputStream();
Nachfolgende Auslassungen...

4. Fazit

Bei der Verwendung kann ein weiteres Problem auftreten: Das Berechnen der Dateigröße im Backend dauert sehr lange, sodass der Fortschrittsbalken im Frontend lange Zeit bewegungslos bleibt und die Benutzer das Gefühl haben, festzustecken. Dies entspricht nicht unseren Anforderungen.

Meine Lösung besteht hier darin, einen Timer auf dem Frontend zu erstellen. Wenn Sie auf „Herunterladen“ klicken, wird zuerst der Timer ausgeführt, der beispielsweise den Fortschritt in 2 Sekunden um 1 % erhöht. Wenn die Gesamtdateigröße vom Hintergrund zurückgegeben wird und der berechnete Prozentsatz (Prozentsatz) den Prozentsatz (Prozentsatz) des Timers überschreitet, schalten Sie den Timer aus und ersetzen Sie das Attribut (Prozentsatz) durch den Fortschrittsprozentsatz. Denken Sie daran, dass es eine Obergrenze für die automatische prozentuale Erhöhung (Prozentsatz) dieses Timers geben muss.
Der Vorteil besteht darin, dass das Frontend reagiert, wenn der Benutzer auf die Download-Schaltfläche klickt. Obwohl die vorherige Antwort möglicherweise falsch ist, spielt es keine Rolle, ob sie wahr oder falsch ist, solange die Verbindung gut ist.

Dies ist das Ende dieses Artikels über vue+element+springboot, um ein Beispiel für eine Anzeigefunktion für den Fortschrittsbalken beim Herunterladen von Dateien zu implementieren. Weitere verwandte Inhalte zum Fortschrittsbalken beim Herunterladen von Element Springboot finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • So implementieren Sie einen in Echtzeit aktualisierten Fortschrittsbalken in SpringBoot
  • Vollständiges Beispiel der Springboot-Uploadfunktion mit Fortschrittsbalken

<<:  6 ungewöhnliche HTML-Tags

>>:  Lösen Sie das Problem, dass Docker das MySQL-Image zu langsam zieht

Artikel empfehlen

Beherrschen Sie die häufig verwendeten HTML-Tags zum Zitieren von Inhalten auf Webseiten.

Verwenden Sie „blockquote“ für lange Zitate, „q“ ...

Detaillierte Erklärung der Fallstricke von MySQL 8.0

Ich habe heute MySQL 8.0 aktualisiert. Das erste ...

Verwenden Sie Elasticsearch, um Indexdaten regelmäßig zu löschen

1. Manchmal verwenden wir ES Aufgrund begrenzter ...

So können Sie lange Vue-Listen schnell laden

Inhaltsverzeichnis Hintergrund Hauptinhalt 1. Kom...

Der gesamte Prozessdatensatz der rekursiven Komponentenkapselung von Vue3

Inhaltsverzeichnis Vorwort 1. Rekursive Komponent...

Linux entfernt node.js vollständig und installiert es über den Befehl yum neu

erster Schritt Einmaliges Löschen mit der integri...

Das Bildelement img hat in IE6 zusätzlichen Leerraum

Beim Erstellen eines DIV+CSS-Layouts einer Seite ...

7 interessante Möglichkeiten, versteckte Elemente in CSS zu erreichen

Vorwort Die Ähnlichkeiten und Unterschiede zwisch...

Detailliertes Installationstutorial für MySQL 5.7.11 unter Win7

Betriebssystem: Win7 64-Bit Ultimate Edition Komp...

Beschreibung der Grenzen und Bereiche zwischen MySQL

MySQL zwischen Grenzbereich Der Bereich zwischen ...

Sortieren von MySQL-Aggregatfunktionen

Inhaltsverzeichnis MySQL-Ergebnissortierung - Agg...

Ein Beispiel für das elegante Schreiben von Urteilen in JavaScript

Inhaltsverzeichnis Vorwort 1. Monadisches Urteil ...

So verwenden Sie Docker zum Bereitstellen von Front-End-Anwendungen

Docker erfreut sich immer größerer Beliebtheit. E...