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

Implementierung der QR-Code-Scanfunktion über Vue

Hinweis Auf dieses Plugin kann nur unter dem http...

Eine detaillierte Einführung in die Verwendung von Blockkommentaren in HTML

Allgemeine Kommentare in HTML: <!--XXXXXXXX--&g...

Die Umsetzung von Youdas neuem Petite-Vue

Inhaltsverzeichnis Vorwort Einführung Live Einfac...

Vergleichen von Dokumentspeicherorten

<br />Ein toller Blogbeitrag von PPK vor zwe...

HTML-Grundlagen - Pflichtlektüre - Umfassendes Verständnis von CSS-Stylesheets

CSS (Cascading Style Sheet) wird zum Verschönern ...

Warum wird UTF-8 in MySQL nicht empfohlen?

Ich bin kürzlich auf einen Fehler gestoßen, als i...

CSS3-Übergang zur Implementierung eines Benachrichtigungsnachrichtenkarussells

Vue-Version, kopiere sie in die Datei und verwend...

So aktivieren Sie die JMX-Überwachung über Tomcat

Erstellen Sie eine Simulationsumgebung: Betriebss...

Beispielanalyse für MySQL-Transaktionen, Isolationsebenen und Sperrenverwendung

Dieser Artikel beschreibt anhand von Beispielen M...

Neue Features in MySQL 8: Unsichtbare Indizes

Hintergrund Indizes sind ein zweischneidiges Schw...

Verwendung von Vue-Filtern und benutzerdefinierten Anweisungen

Inhaltsverzeichnis Filter 01.Was ist 02. Wie es g...