前端 从后端获取(下载,导出)文件的方法

24 篇文章 0 订阅
1 篇文章 0 订阅

场景:

很多时候,前端存在需要从后端下载文件的情况,典型的就是导出excel表格。

一般存在两种方式:

1,请求接口之后,直接打开请求该文件的地址,下载到本地。

2,请求接口之后,将获取到的文件数据格式转换之后,再下载到本地。

 

先说第一种:

很简单,请求完接口之后,打开该文件的地址:

window.location.href = res.request.responseURL

responseURL这个地址其实和接口地址是一样,直接打开它,就能默认下载到本地的下载路径了。

非常方便,但是存在不足,比如不能修改文件的名称。 

而且,有些场景使用这种方式是行不通的,比如,很多管理系统,都是需要登录的,既然要登录,那就一般都会需要验证每个请求是否安全,往往需要在header里带上token,后端才会给你这个请求放行。

所以,这种方式,你请求接口之后,转到这个链接,其实就是再请求了一次,这个时候你是不好在请求里带上token的,自然也就拿不到你要的文件。

所以,这个时候就要用第二种方式。

第二种方式:

第二种方式,就是正常的api请求,获取到文件数据之后,在本地模拟一次点击按钮下载,不过这次下载不是再向后端请求一次api,而是把第一次请求api之后,后端返回的文件数据转换成合适的格式之后下载下来。

exportFile(this.queryParam).then(res => {
        if (res.status === 200) {
          const xlsx = 'application/vnd.ms-excel'
          const blob = new Blob([res.data], { type: xlsx })
          const a = document.createElement('a') // 转换完成,创建一个a标签用于下载
          // const name = res.headers['content-disposition']
          // a.download = name.split('=')[1]
          a.download = `${this.$t('menu.operatelog')}.xlsx`
          a.href = window.URL.createObjectURL(blob)
          a.click()
          a.remove()
          document.body.removeChild(a) //也可以这么移除
          // 直接打开下载文件的链接
          // window.location.href = res.request.responseURL
        }
      })

代码很容易看懂,这里就不解释了,说几个需要提醒的地方。

1.不管是第一种方式还是第二种方式,尽量让后端指定好文件的类型。当然,使用第二种方式,前端可以再次指定好文件类型。

2.这里将获取到的文件内容转换成blob类型的数据,是最常见的下载文件数据的格式,当然还可以使用别的方式。

3.这里创建a标签取下载文件,还可以用别的方式,或者如果碰到浏览器兼容性的问题,可能需要个性化处理。

4.download这里可以拿后端返回的文件名,也可以自己定义文件名,看你自己哪个方便一些。如果后端拿到的文件名是乱码,建议直接在前端定义文件名。

5.最关键的是,下载文件乱码的问题,很多人碰到,解决方法也很简单。

export function exportFile (parameter) {
  return axios({
    url: `${api.file}/export`,
    method: 'get',
    data: parameter,
    header: {
      headers: { 'Content-Type': 'application/x-download' }
    },
    responseType: 'blob'
  })
}

在请求接口的header里一定要指定responseType为blob,否则把返回的文件数据转换成blob对象,blob是不认识的,就会出现乱码。

 

欢饮补充。

 

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要实现前端文件导出获取后端导出进度,可以采用以下步骤: 1. 前端发送导出请求:前端通过HTTP请求向后端发送导出请求,并获取一个任务ID。任务ID可以用来后续查询导出进度和下载文件。 2. 后端处理导出任务:后端接收到导出请求后,开始处理导出任务。这可能涉及生成导出文件、执行复杂的数据处理操作等。在处理过程中,后端需要记录导出进度。 3. 后端记录导出进度:后端可以根据具体的导出任务情况,记录导出进度。这可以是一个百分比、已完成的记录数等。后端需要将导出进度保存在数据库或其他持久化存储中,以便前端后续查询。 4. 前端查询导出进度:前端可以通过定时轮询或使用WebSocket等技术,向后端发送请求以查询导出进度。前端需要将任务ID发送给后端,并从后端获取最新的导出进度信息。 5. 前端展示导出进度:前端根据获取到的导出进度信息,更新UI界面展示当前的导出进度。这可以是一个进度条、文字描述等形式。 6. 导出完成并下载文件:当后端完成导出任务时,前端可以向后端发送下载请求,并提供任务ID。后端根据任务ID找到相应的导出文件,并将文件返回给前端进行下载。 需要注意的是,具体的实现方式可能与后端技术栈、前端框架等有关。以上是一种常见的实现思路,你可以根据自己的项目需求和技术栈进行具体的实现。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值