Je suis en utilisant vuejs 2 + axios. J'ai besoin d'envoyer une requête get, passer des paramètres au serveur, et d'obtenir un fichier PDF en tant que réponse. Le serveur utilise Laravel.
Donc
axios.get(`order-results/${id}/export-pdf`, { params: { ... }})
fait succès de la demande, mais il ne démarre pas forcer le téléchargement, même si le serveur renvoie corriger les en-têtes.
Je pense que c'est une situation typique quand vous en avez besoin, par exemple, la forme d'un rapport au format PDF et passer quelques filtres sur le serveur. Alors, comment pourrait-il être réalisé?
Mise à jour
Donc en fait j'ai trouvé une solution. Cependant, la même approche ne fonctionne pas avec axios, je ne sais pas pourquoi, c'est pourquoi j'ai utilisé raw objet XHR. Donc la solution est de créer un objet blob et l'utilisateur createUrlObject
fonction. Exemple d'échantillon:
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()
}
}
Important: vous devriez avoir de la matrice de la mémoire tampon de réponse de type
Cependant, le code écrit dans axios retourne PDF qui est vide:
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
})