1

I am having some difficulties downloading an excel file in my front-end, which I get through the API response, which I am making to a Flask back-end.

This is what I have so far:

Flask (Backend)

...
generator.generate_excel_report()
return send_file(
    generator.get_excel_report(), # returns location to generated file
    mimetype=sc.CONTENT_TYPE_EXCEL, # application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
    as_attachment=True
)
...

I have tested that this works through Postman, from where I can download this excel report and everything seems OK.

Vue.JS (Front-end)

Here, I make a request to the Flask back-end, which returns the file in the body:

    /**
     * Download Excel version of the report
     */
    downloadExcelReport(data) {
      SERVICE.post(
      `/api/v1/project/${this.projectNumber}/${this.variantName}/${this.buildNumber}/report/excel`, {
            responseType: 'arraybuffer'
          }).then((response) => getExcelReport(response.data))
     },

And the getExcelReport function here:

/**
 * Make a POST request to the back-end that will generate an Excel sheet
 * for the project, and return it.
 */
export function getExcelReport(data) {
  const blob = new Blob([data], { // Make a BLOB object
    type : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  });

  download(blob, "ExcelReport", 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') // use the DownloadJS library and download the file
}

When I try to open the generated Excel report, it says that the file is corrupted. I can also see that the number of bytes is much bigger (around twice bigger).

I have also tried similar solutions from StackOverflow with FileReader. Does anyone else have an idea what I am doing wrong here?

1 Answer 1

5

I solved the issue the following way:

   /**
     * Download Excel version of the report
     */
    downloadExcelReport() {
      const fileName = `${this.projectNumber}_${this.variantName}_#${this.buildNumber}_SWF.xlsx`
      const apiEndpoint = `/api/v1/project/${this.projectNumber}/${this.variantName}/${this.buildNumber}/report/excel`
      const headers = {
        'Content-Disposition': `attachment; filename=${fileName}`,
        'Content-Type':
          'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      }

      SERVICE.post(apiEndpoint, null, {
        headers: headers,
        responseType: 'arraybuffer',
      })
        .then((response) => {
          const url = window.URL.createObjectURL(new Blob([response.data]))
          const link = document.createElement('a')
          link.href = url
          link.setAttribute('download', fileName)
          document.body.appendChild(link)
          link.click()
        })
        .catch((error) => console.log(error))
    },
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.