Beispiel für das Herunterladen von Dateien mit vue+django

Beispiel für das Herunterladen von Dateien mit vue+django

1. Übersicht

Klicken Sie im Projekt auf die Download-Schaltfläche, um die Datei herunterzuladen.

Bei herkömmlichen Download-Links handelt es sich in der Regel um Get-Links, die öffentlich sind und nach Belieben heruntergeladen werden können.

In tatsächlichen Projekten sind einige Download-Links privat. Sie müssen die Post-Methode verwenden und die richtigen Parameter zum Herunterladen übergeben.

2. Django-Projekt

Diese Umgebung verwendet Django 3.1.5 und erstellt ein neues Projekt download_demo

Installieren des Moduls

pip3 installieren djangorestframework django-cors-headers

Ändern Sie die Datei download_demo/settings.py

INSTALLED_APPS = [
 „django.contrib.admin“,
 „django.contrib.auth“,
 „django.contrib.contenttypes“,
 „django.contrib.sessions“,
 „django.contrib.messages“,
 „django.contrib.staticfiles“,
 „api.apps.ApiConfig“,
 'corsheaders', # Anwendung cors registrieren
]

Registrieren von Middleware

MIDDLEWARE = ​​​​[
 „django.middleware.security.SecurityMiddleware“,
 „django.contrib.sessions.middleware.SessionMiddleware“,
 „django.middleware.common.CommonMiddleware“,
 „django.middleware.csrf.CsrfViewMiddleware“,
 „django.contrib.auth.middleware.AuthenticationMiddleware“,
 „django.contrib.messages.middleware.MessageMiddleware“,
 „django.middleware.clickjacking.XFrameOptionsMiddleware“,
 'corsheaders.middleware.CorsMiddleware', # Komponente cors registrieren
]

Die letzte Zeile fügt hinzu

#Cross-Domain-Addition ignoriert CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = Wahr

CORS_ALLOW_METHODEN = (
 'ERHALTEN',
 'OPTIONEN',
 'PATCH',
 'POST',
 'SICHT',
)

CORS_ALLOW_HEADERS = (
 "XMLHttpRequest",
 'X_FILENAME',
 "Kodierung akzeptieren",
 'Genehmigung',
 'Inhaltstyp',
 'nicht',
 'Herkunft',
 "Benutzeragent",
 'x-csrftoken',
 'x-angefordert-mit',
 'Pragma',
)

Ändern Sie download_demo/urls.py

von django.contrib importiere admin
von django.urls Importpfad
aus API-Importansichten

URL-Muster = [
 Pfad('admin/', admin.site.urls),
 Pfad('download/excel/', Ansichten.ExcelFileDownload.as_view()),
]

Ändern Sie api/views.py

von django.shortcuts importiere render,HttpResponse
aus download_demo Importeinstellungen
von django.utils.encoding importiere escape_uri_path
von django.http importiere StreamingHttpResponse
von django.http importiere JsonResponse
von rest_framework.views importiere APIView
vom Rest_Framework-Importstatus
Betriebssystem importieren

Klasse ExcelFileDownload(APIView):
 def post(selbst, Anfrage):
  drucken(Anfrage.Daten)
  # Dateiname = "Big River.xlsx"
  Dateiname = request.data.get("Dateiname")
  Download-Dateipfad = os.Pfad.join(Einstellungen.BASE_DIR, "Upload",Dateiname)
  drucken("Download-Dateipfad",Download-Dateipfad)

  Antwort = self.big_file_download(Download-Dateipfad, Dateiname)
  wenn Antwort:
   Antwort zurückgeben

  return JsonResponse({'status': 'HttpResponse', 'msg': 'Excel-Download fehlgeschlagen'})

 def file_iterator(selbst, Dateipfad, Blockgröße=512):
  """
  Dateigenerator, um zu verhindern, dass die Datei zu groß wird und einen Speicherüberlauf verursacht:param file_path: absoluter Dateipfad:param chunk_size: Blockgröße:return: Generator """
  mit open(file_path, mode='rb') als f:
   während True:
    c = f.lesen(Blockgröße)
    wenn c:
     Ausbeute c
    anders:
     brechen

 def big_file_download(selbst, Download-Dateipfad, Dateiname):
  versuchen:
   Antwort = StreamingHttpResponse(self.file_iterator(download_file_path))
   # Überschriften hinzufügen
   Antwort ['Inhaltstyp'] = 'Anwendung/Oktett-Stream'
   Antwort ['Access-Control-Expose-Headers'] = "Inhaltsdisposition, Inhaltstyp"
   Antwort ['Content-Disposition'] = "Anhang; Dateiname = {}". Format (Escape_uri_Pfad (Dateiname))
   Antwort zurückgeben
  außer Ausnahme:
   return JsonResponse({'status': status.HTTP_400_BAD_REQUEST, 'msg': 'Excel-Download fehlgeschlagen'},
        Status = Status.HTTP_400_BAD_REQUEST)

Erstellen Sie eine Upload-Datei im Stammverzeichnis des Projekts

Fügen Sie eine Excel-Datei ein, zum Beispiel: Great Rivers.xlsx

3. Vue-Projekt

Erstellen Sie ein neues Vue-Projekt und installieren Sie das ElementUI-Modul.

Erstellen Sie eine neue Datei test.vue

<Vorlage>
 <div Stil="Breite: 70 %;Rand links: 30px;Rand oben: 30px;">
 <el-button class="filter-item" type="success" icon="el-icon-download" @click="downFile()">Herunterladen</el-button>
 </div>
</Vorlage>

<Skript>
 Axios von „Axios“ importieren

 Standard exportieren {
 Daten() {
  zurückkehren {
  }
 },
 montiert: Funktion () {

 },
 Methoden: {
  downloadFile(url, options = {}){
  returniere neues Promise((lösen, ablehnen) => {
   // console.log(`${url} Anforderungsdaten, Parameter=>`, JSON.stringify(Optionen))
   // axios.defaults.headers['Inhaltstyp'] = 'Anwendung/json; Zeichensatz=UTF-8'
   axios({
   Methode: 'post',
   url: URL, // Anforderungsadresse data: Optionen, // Parameter responseType: „blob“ // gibt den vom Server zurückgegebenen Datentyp an}).then(
   Antwort => {
    // console.log("Download-Antwort",Antwort)
    auflösen(Antwort.Daten)
    let blob = neuer Blob([Antwort.Daten], {
    Typ: „application/vnd.ms-excel“
    })
    // konsole.log(blob)
    // let Dateiname = Datum.parse(neues Datum()) + '.xlsx'
    // Dateinamen ausschneiden let fileNameEncode = response.headers['content-disposition'].split("filename=")[1];
    // Dekodierung let fileName = decodeURIComponent(fileNameEncode)
    // console.log("Dateiname",Dateiname)
    wenn (window.navigator.msSaveOrOpenBlob) {
    // console.log(2)
    navigator.msSaveBlob(blob, Dateiname)
    } anders {
    // console.log(3)
    var link = document.createElement('a')
    link.href = Fenster.URL.createObjectURL(blob)
    link.download = Dateiname
    link.klick()
    //Speicher freigeben window.URL.revokeObjectURL(link.href)
    }
   },
   err => {
    ablehnen (Fehler)
   }
   )
  })
  },
  // Datei herunterladen downFile(){
  let postUrl = "http://127.0.0.1:8000/download/excel/"
  let Parameter = {
   Dateiname: "Big River.xlsx",
  }
  // console.log("Parameter herunterladen",Params)
  dies.downloadFile(postUrl,params)
  },
 }
 }
</Skript>

<Stil>
</Stil>

Hinweis: Hier wird eine Post-Anfrage verwendet und der Dateiname an die API übermittelt, um die angegebene Datei herunterzuladen.

Besuchen Sie die Testseite und klicken Sie auf die Schaltfläche „Herunterladen“.

Der Download erfolgt automatisch

Öffnen Sie die Symbolleiste, um die Antwortinformationen anzuzeigen

Dies ist hier der von Django zurückgegebene Dateiname. Dies ist auch der vom Browser heruntergeladene und gespeicherte Dateiname.

Wenn chinesische Schriftzeichen gefunden werden, werden sie mit URL-Code codiert.

Daher wird im Vue-Code die Content-Disposition abgeschnitten und der Dateiname abgerufen.

Oben sind die Einzelheiten des Beispiels für das Herunterladen von Dateien mit vue+django aufgeführt. Weitere Informationen zum Herunterladen von Dateien mit vue+django finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • So verwenden Sie Vue zum direkten Herunterladen von Dateien und Ändern von Dateinamen über die URL-Verbindung von Alibaba Cloud OSS
  • Springboot + Vue realisiert Seiten-Download-Datei
  • Springboot+vue zum Realisieren des Hoch- und Herunterladens von Dateien
  • Vue implementiert den kompletten Frontend- und Backend-Code zum Herunterladen von Dateistreams
  • Tutorial zum Batch-Download von Dateien/Bildern im Zip-Format mit Vue
  • vue - Dateivorgänge zum Herunterladen und Exportieren in Form eines Dateistream-Blobs
  • Verwenden Sie Axios in Vue, um die Post-Methode zum Abrufen einer binären Stream-Download-Datei zu implementieren (Beispielcode).
  • Vue Excel-Upload-Vorschau und Tabelleninhalt-Download in Excel-Datei
  • Springboot integriert Vue zum Hoch- und Herunterladen von Dateien
  • Vue implementiert Online-Vorschau von PDF-Dateien und Download (pdf.js)
  • Vue implementiert die Funktion zum Klicken auf eine Schaltfläche zum Herunterladen von Dateien

<<:  Tutorial zur Remote-Verbindung mit einer MySQL-Datenbank unter Linux

>>:  Hinweise zur Adresszuordnung von Gerätetreibern im Linux-Kernel

Artikel empfehlen

Detailliertes Tutorial zum Erstellen eines Gitlab-Servers auf CentOS8.1

Über den Unterschied zwischen Gitlab und Github m...

So versuchen Sie, Ihrem CSS einen Sticky-Effekt hinzuzufügen

Vorne geschrieben Ich weiß nicht, wer als Erster ...

Einführung in MySQL-Anweisungskommentare

MySQL unterstützt drei Arten von Kommentaren: 1. ...

So reduzieren Sie den Speicherverbrauch und die CPU-Auslastung von Webseiten

Manche Webseiten erscheinen möglicherweise nicht ...

Implementierung von JavaScript zum Herunterladen und Hochladen verknüpfter Bilder

Da wir Bilder hochladen möchten, müssen wir zunäc...

Detaillierte Erläuterung der Mysql-Funktionsaufrufoptimierung

Inhaltsverzeichnis Funktionsaufrufoptimierung Fun...

Detaillierte Erläuterung des Nginx-Forward-Proxys und des Reverse-Proxys

Inhaltsverzeichnis Weiterleitungsproxy Nginx-Reve...

Detailliertes Tutorial zur Installation des ElasticSearch:7.8.0-Clusters mit Docker

Der ElasticSearch-Cluster unterstützt動態請求的方式und靜態...

Vue verwendet Mixins zur Optimierung von Komponenten

Inhaltsverzeichnis Mixins-Implementierung Zusamme...