Das Vue-Projekt implementiert eine Fortschrittsbalkenfunktion für den Dateidownload

Das Vue-Projekt implementiert eine Fortschrittsbalkenfunktion für den Dateidownload

Im täglichen Geschäftsleben gibt es zwei gängige Möglichkeiten, Dateien herunterzuladen:

Die erste besteht darin, direkt auf die Dateiadresse des Servers zuzugreifen und die Datei automatisch herunterzuladen.

Bei der zweiten Methode gibt der Server einen Blob-Dateistream zurück, der dann verarbeitet und heruntergeladen wird.

Im Allgemeinen eignen sich kleine Dateien für die erste Download-Lösung, die nicht zu viele Serverressourcen beansprucht. Bei großen Dateien wird häufig Dateistreaming zur Übertragung verwendet, wie in der Abbildung dargestellt:

Nachdem der Dateistrom erfolgreich übertragen wurde, kann der Browser über den folgenden Code sofort mit dem Herunterladen des Dateistroms beginnen:

Diese Methode hat auch Nachteile. Während des Dateistream-Übertragungsprozesses kann der Benutzer den Übertragungsstatus (Fortschritt) des Dateistreams nicht erkennen, was zu Problemen führen kann (es ist unmöglich festzustellen, ob der aktuelle Downloadvorgang wirksam wurde). In diesem Fall können wir den Status des Dateistroms und den Übertragungsfortschritt auf der Seite anzeigen, um die Interaktivität und Benutzerfreundlichkeit der Seite zu verbessern.

Als nächstes folgt die konkrete Umsetzung:

Kapselung der JS-Methode:

/**
 * @param {Object} data: {url: Dateiadresse, download: Dateiname}
 */
Exportfunktion downLoadAll(Daten) {
  runterlassenProgress = {};
  let uniSign = new Date().getTime() + ''; // Sie können klicken, um mehrere Dateien nacheinander herunterzuladen. Hier wird der Zeitstempel verwendet, um jede heruntergeladene Datei zu unterscheiden axios.get(
    Daten.URL, 
    { Antworttyp: 'Blob', Header: { "Inhaltstyp": "application/json; Zeichensatz = utf-8" },
    onDownloadProgress (Fortschritt) {
      downProgress = Math.round(100 * progress.loaded / progress.total) // „loaded“ im Progress-Objekt gibt die heruntergeladene Menge an, „total“ die Gesamtmenge. Berechnen Sie hier den Prozentsatzstore.commit('caseInformation/SET_PROGRESS', {path: uniSign, 'progress': downProgress}) // Kombinieren Sie den Dateinamen und den Download-Fortschritt dieses Downloads in einem Objekt und verwenden Sie die Vuex-Statusverwaltung}}).then( (res)=>{ // Starten Sie den Dateidownload, nachdem die Dateistream-Übertragung abgeschlossen istif(data.downLoad){
        jsFileDownload(res.data,data.downLoad+'.'+data.url.replace(/.+\./,"")); // jsFileDownLoad wird zum Herunterladen von Dateistreams verwendet. Plugin herunterladen: npm i js-file-download, importieren: import jsFileDownLoad from 'js-file-download'
      } anders {
        : Wenn Sie eine Datei mit einem bestimmten Namen herunterladen, wird die Datei mit dem Namen des Benutzers gelöscht.
      }
  }).fangen((e)=>{
    this.$message.error('Die Datei kann nicht heruntergeladen werden.')
  })
}

caseInfomation.js im Store:

...

konstanter Zustand = {
  progressList: [], // Fortschrittsliste des Dateidownloads ...
}

const Mutationen = {
  SET_PROGRESS: (state, progressObj)=>{ // Ändere die Fortschrittsliste if(state.progressList.length){ // Wenn die Fortschrittsliste existiert if(state.progressList.find(item=>item.path == progressObj.path)){ // Der oben erwähnte Pfad-Zeitstempel ist der einzige, der existiert. Wenn du also das aktuelle Fortschrittsobjekt in der Fortschrittsliste findest state.progressList.find(item=>item.path == progressObj.path).progress = progressObj.progress // Ändere den Fortschritt des aktuellen Fortschrittsobjekts
      }
    }anders{
      state.progressList.push(progressObj) // Die aktuelle Fortschrittsliste ist leer, es gibt keine Download-Aufgabe, füge das Fortschrittsobjekt direkt zum Fortschritts-Array hinzu}
  },
  DEL_PROGRESS: (Status, Eigenschaften) => {
    state.progressList.splice(state.progressList.findIndex(item=>item.path == props), 1) // Lösche das Fortschrittsobjekt in der Fortschrittsliste},
  ...
}

Auf der Seite wird der Popup-Code für den Fortschritt angezeigt, downLoadNotice.vue:

<Vorlage>

</Vorlage>

<Skript>
  importiere { mapState } von 'vuex'

  Standard exportieren {
    Name: 'downLoadNotice',
    berechnet: {
      ...mapState({
      „Fortschrittsliste“: Status => Status.Fallinformation.Fortschrittsliste
    })
    },
    Daten() {
      zurückkehren {
        benachrichtigen: {} // Wird verwendet, um das Popup-Fensterobjekt für den Download-Dateifortschritt beizubehalten}
    },
    watch: { //Fortschrittsliste überwachen progressList: {
        Handler(n) {
          let Daten = JSON.parse(JSON.stringify(n))
          Daten.fürJeden(Element => {
            const domList = [...document.getElementsByClassName(item.path)]
            if (domList.find(i => i.className == item.path)) { // Wenn die Seite bereits ein Popup-Fenster für das Fortschrittsobjekt hat, aktualisiere dessen Fortschritt
              domList.find(i => i.className == item.path).innerHTML = item.progress + '%'
            } anders {
              if (item.progress === null) { // Fehlertolerante Verarbeitung hier, wenn der Backend-Übertragungsdateistream einen Fehler meldet, löschen Sie das aktuelle Fortschrittsobjekt this.$store.commit('caseInformation/DEL_PROGRESS', item.path)
                zurückkehren
              }// Wenn auf der Seite kein Popup-Fenster vorhanden ist, das dem Fortschrittsobjekt entspricht, erstellen Sie auf der Seite ein neues Popup-Fenster und fügen Sie das Popup-Fensterobjekt zur Benachrichtigung hinzu. Der Attributname ist der Pfad des Fortschrittsobjekts (wie oben erwähnt, ist der Pfad eindeutig) und der Attributwert ist $notify (Benachrichtigungskomponente im Element UI) Popup-Fensterobjekt this.notify[item.path] = this.$notify.success({
                // Titel: 'Info',
                dangerouslyUseHTMLString: true,
                Nachricht: `<p style="width: 100px;">Herunterladen<span class="${item.path}" style="float: right">${item.progress}%</span></p>`, // Zeigt den Download-Prozentsatz an, der Klassenname ist der Pfad des Fortschrittsobjekts (um die Aktualisierung des Fortschrittsprozentsatzes später zu erleichtern)
                showClose: false,
                Dauer: 0
              })
            }
            Konsole.log(Element.Fortschritt + '%', '-------------------------->')

            if (item.progress == 100) { // Wenn der Download-Fortschritt 100 % erreicht, schließe das Popup-Fenster und lösche das in der Benachrichtigung this.notify[item.path].close() verwaltete Popup-Fensterobjekt.
              // lösche this.notify[item.path] Das oben genannte close()-Ereignis ist asynchron. Es hier direkt zu löschen, führt zu einem Fehler. Verwenden Sie setTimeout, um den Vorgang zur asynchronen Warteschlange hinzuzufügen setTimeout(() => {
                lösche this.notify[item.path]
              }, 1000)
              this.$store.commit('caseInformation/DEL_PROGRESS', item.path) // Lösche das Fortschrittsobjekt in der Fortschrittsliste des Status in caseInformation}
          })
        },
        tief: wahr
      }
    }
  }
</Skript>

<Stilbereich>

</Stil>

Wir können den obigen Code in den Mixins-Ordner kapseln und ihn mithilfe von Mixins in die Seite einbinden:

Downloadvorgang auf der Seite auslösen:

herunterladen(Artikel){
   lass runterDaten = {
      URL: `ipdoc${item.url}`,
      herunterladen: item.fileName
   }
   this.$commonUtils.downLoadAll(downData) // herunterladen},

Der endgültige Seiteneffekt:

Bitte beachten Sie abschließend, dass der obige Download-Fortschritt nicht die tatsächlich heruntergeladene Datei ist, sondern der Dateistream. Nachdem der Dateistream heruntergeladen wurde, kann die eigentliche Datei über das oben erwähnte Plugin „js-file-download“ heruntergeladen werden!

Dies ist das Ende dieses Artikels über die Implementierung eines Fortschrittsbalkens für Dateidownloads in einem Vue-Projekt. Weitere relevante Inhalte zum Fortschrittsbalken für Vue-Dateidownloads finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Vue implementiert Drag-Fortschrittsbalken
  • Beispiel für die Implementierung eines kreisförmigen Fortschrittsbalkens in Vue
  • vue.js + ElementUI realisiert den Effekt des Fortschrittsbalkens, der zur Kennwortstärke auffordert
  • Fortschrittsbalkenfunktion beim Laden der Vue-Seite (Beispielcode)
  • Kapselung des zyklischen Ladefortschrittsbalkens (Vue-Plug-in-Version und native JS-Version)
  • Vue konfiguriert nprogress, um den Fortschrittsbalken oben auf der Seite zu implementieren
  • So verwenden Sie den NProgress-Fortschrittsbalken in Vue

<<:  Detaillierter Prozess zum Konfigurieren eines HTTPS-Zertifikats unter Nginx

>>:  MySQL-Lösung zur funktionalen Indexoptimierung

Artikel empfehlen

Geben Sie einige Tipps zur Verwendung von JavaScript-Operatoren

Inhaltsverzeichnis 1. Optionaler Verkettungsopera...

Zusammenfassung der Tipps zur Verwendung von coalesce() in MySQL

Vorwort Kürzlich habe ich zufällig MySQLs Coalesc...

Tutorial zur kostenlosen Konfiguration der MySQL 5.7.18-Installationsversion

Installations-Tutorial zur kostenlosen Installati...

Eine kurze Diskussion über die Definition und Vorsichtsmaßnahmen von H-Tags

Den Ergebnissen zufolge gibt es für die Definitio...

Ähnlich wie HTML-Tags: strong und em, q, cite, blockquote

Es gibt einige Tags in XHTML, die ähnliche Funkti...

Implementierung der K8S-Bereitstellung eines Docker-Containers

Umgebung: (Docker, K8s-Cluster), fahren Sie mit d...

So verwenden Sie das Vue-Router-Routing

Inhaltsverzeichnis 1. Beschreibung 2. Installatio...

Centos7.5 Konfiguration Java-Umgebung Installation Tomcat Erklärung

Tomcat ist eine auf Java basierende Webserversoft...