Handle file download from ajax post

前端 未结 20 2641
心在旅途
心在旅途 2020-11-21 05:46

I have a javascript app that sends ajax POST requests to a certain URL. Response might be a JSON string or it might be a file (as an attachment). I can easily detect Content

20条回答
  •  时光说笑
    2020-11-21 06:04

    I needed a similar solution to @alain-cruz's one, but in nuxt/vue with multiple downloads. I know browsers block multiple file downloads, and I also have API which returns a set of csv formatted data.I was going to use JSZip at first but I needed IE support so here is my solution. If anyone can help me improve this that would be great, but it's working for me so far.

    API returns:

    data : {
      body: {
        fileOne: ""col1", "col2", "datarow1.1", "datarow1.2"...so on",
        fileTwo: ""col1", "col2"..."
      }
    }
    

    page.vue:

    
    
    export default = {
       data() {
         return {
           fileNames: ['fileOne', 'fileTwo'],
         }
       },
      computed: {
        ...mapState({
           fileOne: (state) => state.exportFile.fileOne,
           fileTwo: (state) => state.exportFile.fileTwo,
        }),
      },
      method: {
        handleExport() {
          //exportFileAction in store/exportFile needs to return promise
          this.$store.dispatch('exportFile/exportFileAction', paramsToSend)
            .then(async (response) => {
               const downloadPrep = this.fileNames.map(async (fileName) => {
               // using lodash to get computed data by the file name
               const currentData = await _.get(this, `${fileName}`);
               const currentFileName = fileName;
               return { currentData, currentFileName };
             });
             const response = await Promise.all(downloadPrep);
             return response;
           })
           .then(async (data) => {
             data.forEach(({ currentData, currentFileName }) => {
               this.forceFileDownload(currentData, currentFileName);
             });
           })
           .catch(console.error);
        },
        forceFileDownload(data, fileName) {
         const url = window.URL
             .createObjectURL(new Blob([data], { type: 'text/csv;charset=utf-8;' }));
         const link = document.createElement('a');
         link.href = url;
         link.setAttribute('download', `${fileName}.csv`);
         document.body.appendChild(link);
         link.click();
       },
    }
    

提交回复
热议问题