Force-download GET-Anforderung mit axios

Ich bin mit vuejs 2 + axios.
Ich brauche zum senden einer get-Anforderung, einige Parameter zu server und in einer PDF-Datei als Antwort. Server verwendet Laravel.

So

axios.get(`order-results/${id}/export-pdf`, { params: { ... }})

macht eine erfolgreiche Anfrage, aber es startet nicht zwingen, herunterladen, obwohl die server wieder richtigen Header.

Ich denke, dies ist eine typische situation, wenn Sie brauchen, um, sagen wir, in form einer PDF-Bericht und einige Filter zum server. Also, wie könnte es erreicht werden?

Update

So, ich habe tatsächlich eine Lösung gefunden. Aber den gleichen Ansatz hat nicht funktioniert mit axios, weiß nicht, warum, das ist, warum ich roh verwendet XHR-Objekt. So die Lösung ist, erstellen Sie ein blob-Objekt und Benutzer createUrlObject Funktion. Beispiel:

let xhr = new XMLHttpRequest()
xhr.open('POST', Vue.config.baseUrl + `order-results/${id}/export-pdf`, true)
xhr.setRequestHeader("Authorization", 'Bearer ' + this.token())
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
xhr.responseType = 'arraybuffer'

xhr.onload = function(e) {
  if (this.status === 200) {
    let blob = new Blob([this.response], { type:"application/pdf" })
    let link = document.createElement('a')
    link.href = window.URL.createObjectURL(blob)
    link.download = 'Results.pdf'
    link.click()
  }
}

Wichtig: Sie sollten array buffer als Antwort geben

Jedoch der gleiche code geschrieben axios zurück PDF ist leer:

axios.post(`order-results/${id}/export-pdf`, {
  data,
  responseType: 'arraybuffer'
}).then((response) => {
  console.log(response)

  let blob = new Blob([response.data], { type: 'application/pdf' } ),
      url = window.URL.createObjectURL(blob)

  window.open(url); //Mostly the same, I was just experimenting with different approaches, tried link.click, iframe and other solutions
})

InformationsquelleAutor der Frage Victor | 2017-04-16

Schreibe einen Kommentar