vue请求接口返回文件流并进行下载

11 篇文章 0 订阅
8 篇文章 0 订阅

vue项目,有两种方式实现请求接口返回文件流并进行下载:

第一种:使用a标签的特性,使用链接实现

第二种:下载文件流的方式

一。前端实现静态文件的下载

1.将要下载的静态文件放入项目的public文件夹中,如下图,test.pptx文件

2.代码中添加a标签:
<a href="..//test.pptx" style="color: #FF0000; text-decoration: underline" >下载</a>
3.打包之后test.pptx文件就会放在打包文件dist中,如下图:

二。当接口为get请求时,可以使用a标签实现动态文件的下载

这里使用的是前后端合作的方式

下载动态文件流就是文件存储在后台,需要使用接口请求,来实现文件的下载

1.配置项目的Base url
const URL_GLOBAL = {
    development: "http://localhost",
    production: "https://baidu.com",

    developmentPort: ":8888/hhh",
    productionPort: "/abc",
}

this.globalURL = URL_GLOBAL[process.env.NODE_ENV] + URL_GLOBAL[process.env.NODE_ENV + 'Port'];
2.当接口为get请求时,可以使用a标签,将接口拼接在href中,如果有参数可以直接拼接在url后面
          <a 
            :href="globalURL +'/download/downloadexcel?type=code" 
            >Download Excel
          </a>
3.点击页面中a标签的按钮,就可以将文件下载到本地了

三。当接口为post请求时,就不能使用a标签了,使用下载文件流的方式实现

 1.配置项目的Base url
const URL_GLOBAL = {
    development: "http://localhost",
    production: "https://baidu.com",

    developmentPort: ":8888/hhh",
    productionPort: "/abc",
}

this.globalURL = URL_GLOBAL[process.env.NODE_ENV] + URL_GLOBAL[process.env.NODE_ENV + 'Port'];
2.使用按钮触发下载
<el-button type="primary" @click="exportExcel">Download Excel</el-button>
3.引入axios
import axios from "axios";
4.实现接口请求,下载文件流

 注意必坑:

当获取后端设置的响应头字段时,比如设置的文件名称或者自定义的参数时,

要在后端设置响应头,必须要设置以下代码,来公开自定义响应头,否则前端拿不到响应头中对应的数据:

response.setHeader("Access-Control-Expose-Headers","content-disposition");

    exportExcel() {
      let params = {
        type: 'code'
      }
      //下载文件流
      let url = this.globalURL + '/code/getcode'
      axios.post(url,params,{
        responseType:'blob'
      }).then(res => {
        const name = res.headers['content-disposition'];
        let fileName = '';
        if (name) {
          const str1 = name.replace(' ', '');
          const arr1 = str1.split(';');
          arr1.some(item => {
            if (item.indexOf('filename') != -1) {
              fileName = item.split('=')[1];
            }
            return item.indexOf('filename') != -1;
          });
          if (fileName === ''){
            fileName = 'excel.xlsx'
          }
        } else {
          fileName = 'excel.xlsx'
        }

        try {
          let objectUrl1 = window.URL.createObjectURL(new Blob([res.data]));
          let elink = document.createElement('a');
          elink.setAttribute('download', decodeURI(decodeURI(fileName)));
          elink.style.display = 'none';
          elink.href = objectUrl1;
          document.body.appendChild(elink);
          elink.click();
          document.body.removeChild(elink);
          window.URL.revokeObjectURL(elink.href);
        }catch (err){
          this.$message.warning('download error!')
        }
      })
    },

四.如果想要下载的接口request配置headers,a标签就不能满足需求了,需要使用下载文件流的方式实现

这种方式,不管接口是get请求,还是post请求都可以用

1.配置request.js文件,封装axios
const service = axios.create({
  baseURL: URL_GLOBAL[process.env.NODE_ENV] + URL_GLOBAL[process.env.NODE_ENV +'Port'],
  timeout: 300000,
});

配置请求头,将需要的信息存储在请求头中

service.interceptors.request.use(
    async (config)=>{
        if (process.env.NODE_ENV !== 'development'){
            config.headers['username'] = 'annie'
        }
        return config
    },
    error => {
        Promise.reject(error)
    }
)
2.在vue文件中,引入封装好的axios
import fetch from "../request"

使用按钮触发下载事件

<el-button type="primary" @click="downloadFiles">Download excel</el-button>
3.实现接口请求,下载文件流

注意必坑:

当获取后端设置的响应头字段时,比如设置的文件名称或者自定义的参数时,

要在后端设置响应头,必须要设置以下代码,来公开自定义响应头,否则前端拿不到响应头中对应的数据:

response.setHeader("Access-Control-Expose-Headers","fileName");

详细了解Access-Control-Expose-Headers:Access-Control-Expose-Headers 响应报头、跨域 公开响应头_withexposedheaders-CSDN博客

接口请求

downloadFiles() {
      return new Promise((resolve, reject) => {
          fetch({
              url: "/down/download",
              method: "get",
              params: {
                  id: '222',
              },
              responseType: "blob",
          })
              .then((res) => {
                // 获取后端设置的响应头字段时,比如设置的文件名称或者自定义的参数时,
                  // 在后端设置响应头时,必须要设置以下代码,来公开自定义响应头,否则前端拿不到:
                  // response.setHeader("Access-Control-Expose-Headers","fileName");
                  const fileName = res.headers["filename"];
                  const blob1 = res.data;
                  console.log(blob1)
                  console.log(fileName)
                  if ("download" in document.createElement("a")) {
                      const elink = document.createElement("a");
                      elink.download = decodeURIComponent(fileName);
                      elink.style.display = "none";
                      elink.href = URL.createObjectURL(blob1);
                      document.body.appendChild(elink);
                      elink.click();
                      console.log(elink)
                      URL.revokeObjectURL(elink.href); // 释放URL 对象
                      document.body.removeChild(elink);
                  } else {
                      // IE10+下载
                      navigator.msSaveBlob(blob1, fileName);
                  }
              })
              .catch((err) => {
                  reject(err);
              });
      });
    },

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue接口返回的二维码文件是一个二进制数据,在前端中可以通过将文件转换为Base64编码的字符串来进行处理和展示。可以使用Axios等HTTP请求库发送请求获取二维码文件,然后将其转换为Base64编码。 首先,在Vue组件中引入Axios库,并发送GET请求获取二维码文件: ```javascript import axios from 'axios'; axios({ method: 'GET', url: '/api/qrcode', responseType: 'blob' // 设置响应类型为二进制数据 }).then(response => { const blob = response.data; const reader = new FileReader(); reader.readAsDataURL(blob); // 将二进制数据转换为Base64编码 reader.onloadend = () => { const base64Data = reader.result; this.qrcodeImage = base64Data; // 将Base64编码的二维码图片赋给组件的数据属性 }; }); ``` 然后,在Vue模板中使用`img`标签来展示Base64编码的二维码图片: ```html <template> <div> <img :src="qrcodeImage" alt="二维码"> </div> </template> ``` 最后,在Vue组件的数据属性中定义`qrcodeImage`用于存储Base64编码的二维码图片: ```javascript export default { data() { return { qrcodeImage: '' }; } } ``` 这样,通过将二维码文件转换为Base64编码的字符串,我们可以在Vue中展示接口返回的二维码图片。 ### 回答2: Vue 接口返回的二维码文件,可以通过以下步骤进行处理: 首先,在 Vue 组件中发起请求获取二维码文件。可以使用 Axios 这样的库来发送 HTTP 请求,并设置响应类型为二进制。 ```javascript axios({ method: 'GET', url: 'your_api_endpoint', responseType: 'blob' // 设置响应类型为二进制 }).then(response => { // 处理返回的二维码文件 const qrCodeBlob = response.data; // ... }).catch(error => { // 处理请求错误 console.error(error); }); ``` 接下来,对返回的二维码文件进行处理。可以使用 FileSaver.js 这样的库将二进制保存为二维码图片文件。 ```javascript import { saveAs } from 'file-saver'; // 保存二维码文件为图片文件 saveAs(qrCodeBlob, 'qrcode.png'); ``` 这样就成功将接口返回的二维码文件保存为本地的图片文件了。 请注意,以上代码中的 `your_api_endpoint` 是你实际的接口地址,需要替换为正确的值。另外,需要在 Vue 项目中安装并导入 Axios 和 FileSaver.js 这两个库。 希望以上回答能对你有所帮助,如果还有其他疑问,请随时追问。 ### 回答3: 当Vue接收到接口返回的二维码文件时,可以通过以下方式进行处理: 1. 接口返回的二维码文件可以是一个二进制,我们可以使用Vue中的axios库来发送请求获取该接口返回文件数据。 2. 在Vue组件中,通过axios发送请求获取接口返回的二维码文件。可以使用axios的get方法来发送请求,并将接口地址作为参数传递进去。 3. 在获取到文件数据后,可以将其转换成Blob对象,可以使用FileReader对象来进行转换。 4. 使用FileReader的readAsDataURL方法将Blob对象转换为data URL,这样可以在前端页面中直接显示这个二维码图片。 5. 将转换后的data URL赋值给Vue组件中的图片对象的src属性,即可在页面上显示二维码图片。 以上是处理Vue接收到接口返回的二维码文件的一般程,具体的实现可能需要根据实际情况进行调整和完善。这样,我们就可以在Vue中成功处理接口返回的二维码文件,并在页面上显示二维码图片。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值