vue 实现文件下载(从后台请求的数据)(包括下载图片、pdf、word等文件格式)

16 篇文章 1 订阅

下载最简单的方法就是用a链接实现,然后加一个download属性。但是有一个问题,从后台请求回的接口,对于图片和pdf及svg都不能实现下载功能,也就是download没有起作用。所以下面的方法就是解决这个问题的。

<a @click="downloadFile(file.name, file.url)" >下载</a>

/* 第一个参数是文件的名字,第二个参数是文件的路径*/

downloadFile(fileName, data) {
      if (!data) {
        return;
      }
      let url = window.URL.createObjectURL(new Blob([data]));
      let link = document.createElement('a');
      link.style.display = 'none';
      link.href = url;
      link.setAttribute('download', fileName);
      document.body.appendChild(link);
      link.click();
    }

很简单,其实主要是把url转为[blob]文件格式

如果可以的话也可以直接让后端返回文件流格式的路径,也就不用自己再转换了,直接

<a :href="item.src" :download="item.name"/> 

让后端返回[blob]文件格式,需要传递 responseType: ‘blob’

function downloadPost (config){
  return new Promise((resolve,reject) => {
    axios({
        url: config.url,
        method: 'post',
        data: config.data,
        responseType: 'blob'
    }).then(res => {
      resolve(res)
    }).catch(err=>{
      reject(err);
    });
  });
}

参考文章:https://blog.csdn.net/ying940718/article/details/98500667

在前端使用Vue发送请求下载PDF文件需要用到两个技术:axios和Blob。 首先,在Vue项目中安装axios: ``` npm install axios --save ``` 然后,在Vue组件中使用axios发送请求下载PDF文件: ```javascript import axios from 'axios' export default { methods: { downloadPDF() { axios({ url: 'your-backend-api', method: 'GET', responseType: 'blob' // 返回类型为blob }).then(response => { const url = window.URL.createObjectURL(new Blob([response.data])) const link = document.createElement('a') link.href = url link.setAttribute('download', 'file.pdf') // 下载文件名 document.body.appendChild(link) link.click() }) } } } ``` 在代码中,我们设置了axios的请求类型为'GET',返回类型为'blob'。当请求成功时,我们将response.data转换为Blob类型,创建URL并生成一个a标签用于下载。将a标签添加到body中,模拟用户点击下载。最后,我们需要注意设置下载文件的文件名。 在后端,你需要设置响应头的Content-Type为'application/pdf',推荐使用node.js的mime模块来获取正确的Content-Type: ```javascript const fs = require('fs') const path = require('path') const mime = require('mime') app.get('/download', (req, res) => { const filePath = path.join(__dirname, 'file.pdf') const fileStream = fs.createReadStream(filePath) const contentType = mime.getType(filePath) res.setHeader('Content-Type', contentType) res.setHeader('Content-Disposition', 'attachment; filename=file.pdf') fileStream.pipe(res) }) ``` 在代码中,我们使用fs模块读取文件流,使用mime模块获取正确的Content-Type并设置响应头。最后,将文件流通过管道pipe到响应中,完成下载
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值