Force download GET request using axios

后端 未结 6 1683
生来不讨喜
生来不讨喜 2020-12-07 16:39

I\'m using vuejs 2 + axios. I need to send a get request, pass some params to server, and get a PDF as a response. Server uses Laravel.

So

axios.get(         


        
相关标签:
6条回答
  • 2020-12-07 16:57

    You're getting empty PDF 'cause no data is passed to the server. You can try passing data using data object like this

      axios
        .post(`order-results/${id}/export-pdf`, {
          data: {
            firstName: 'Fred'
          },
          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
        })

    By the way I gotta thank you so much for showing me the hint in order to download pdf from response. Thank ya :)

                    var dates = {
                        fromDate: 20/5/2017,
                        toDate: 25/5/2017
                    }
    

    The way in which I have used is,

    axios({
      method: 'post',
      url: '/reports/interval-dates',
      responseType: 'arraybuffer',
      data: dates
    }).then(function(response) {
      let blob = new Blob([response.data], { type: 'application/pdf' })
      let link = document.createElement('a')
      link.href = window.URL.createObjectURL(blob)
      link.download = 'Report.pdf'
      link.click()
    })

    0 讨论(0)
  • 2020-12-07 16:58

    I had similar issues- I ended up creating link and downloading from there.

    I put more details of how in the answer on another stackoverflow question.

    0 讨论(0)
  • 2020-12-07 17:00

    I don't think its possible to do this in axios or even AJAX. The file will be kept in memory, i.e. you cannot save file to disk. This is because JavaScript cannot interact with disk. That would be a serious security issue and it is blocked in all major browsers.

    You can construct your URL in front-end and download it in the following way:

     var url = 'http://example.com/order-results/' + id + '/export-pdf?' + '..params..' 
    
     window.open(url, '_blank');
    

    Hope this helps!

    0 讨论(0)
  • 2020-12-07 17:07

    Try this: It works perfectly for me with compatibility for Internet Explorer 11 (createObjectURL doesn't work on Explorer 11)

    axios({
      url: 'http://vvv.dev',
      method: 'GET',
      responseType: 'blob', // important
    }).then((response) => {
      if (!window.navigator.msSaveOrOpenBlob){
        // BLOB NAVIGATOR
        const url = window.URL.createObjectURL(new Blob([response.data]));
        const link = document.createElement('a');
        link.href = url;
        link.setAttribute('download', 'download.pdf');
        document.body.appendChild(link);
        link.click();
      }else{
        // BLOB FOR EXPLORER 11
        const url = window.navigator.msSaveOrOpenBlob(new Blob([response.data]),"download.pdf");
      }
    });
    

    https://gist.github.com/javilobo8/097c30a233786be52070986d8cdb1743

    0 讨论(0)
  • 2020-12-07 17:18

    this code works for me :

    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.send()
    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()
    }
    

    }

    0 讨论(0)
  • 2020-12-07 17:21

    I tried some of the above suggested approaches but in my case the browser was sending me the popup block warning. The code described below worked for me:

    axios.get(url, {responseType: 'arraybuffer'})
       .then(function (response) {
         var headers = response.headers();
         var blob = new Blob([response.data],{type:headers['content-type']});
         var link = document.createElement('a');
         link.href = window.URL.createObjectURL(blob);
         link.download = "Your_file_name";
         link.click();
    });
    
    0 讨论(0)
提交回复
热议问题