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

Verwendung von Provide und Inject in Vue3

1. Erklärung von provide und inject Mit „Bereitst...

Native JS-Drag-and-Drop-Funktion zum Erstellen eines Slider-Beispielcodes

Drag & Drop ist eine gängige Funktion im Fron...

Eine kurze Diskussion darüber, wie man JS Schritt für Schritt lernt

Inhaltsverzeichnis Überblick 1. Verstehen Sie die...

Was Sie beim Schreiben selbstschließender XHTML-Tags beachten sollten

Das img-Tag in XHTML sollte wie folgt geschrieben...

Prozessdiagramm für das erste Bereitstellungs-Webprojekt von Tomcat

Legen Sie Ihr eigenes Webprojekt im Verzeichnis w...

Zwei Methoden zum Wiederherstellen von MySQL-Daten

1. Einleitung Vor einiger Zeit gab es eine Reihe ...

Vergleich zwischen Redis und Memcache und Auswahlmöglichkeiten

Ich verwende Redis seit Kurzem und finde es recht...

Mysql-Datumsformatierung und komplexe Datumsbereichsabfrage

Inhaltsverzeichnis Vorwort Anwendungsszenarios fü...

JS-Prinzip der asynchronen Ausführung und Rückrufdetails

1. JS-Prinzip der asynchronen Ausführung Wir wiss...

Erfahren Sie, wie Sie Nginx schnell in CentOS7 installieren

Inhaltsverzeichnis 1. Übersicht 2. Laden Sie das ...

mySql SQL-Abfrageoperation für statistische Mengen

Ich werde nicht viel Unsinn erzählen, schauen wir...