前端使用axios下载文件和上传文件

首先,axios实例在发起下载文件请求时,应该配置responseType: 'blob',例如:

javascript 复制代码
// axios发起下载文档请求
export const downloadDoc = (id: string) => {
  return request.get(`/downloadDoc?id=${id}`, {
  	// 参考官方文档https://www.axios-http.cn/docs/req_config,responseType: 'blob'是浏览器专属
    responseType: 'blob'
  }) as Promise<Blob>
}
// 下载文件通用函数
export function download(filename: string, data: Blob): void {
  let downloadUrl = window.URL.createObjectURL(data) //创建下载的链接
  let anchor = document.createElement('a') // 通过a标签来下载
  anchor.href = downloadUrl
  anchor.download = filename // download属性决定下载文件名
  anchor.click() // //点击下载
  window.URL.revokeObjectURL(downloadUrl) // 下载后释放Blob对象
}

download的属性是HTML5新增的属性 href属性的地址必须是非跨域的地址,如果引用的是第三方的网站或者说是前后端分离的项目(调用后台的接口),这时download就会不起作用。 此时,如果是下载浏览器无法解析的文件,例如.exe,.xlsx...那么浏览器会自动下载,但是如果使用浏览器可以解析的文件,比如.txt,.png,.pdf...浏览器就会采取预览模式;所以,对于.txt,.png,.pdf等的预览功能我们就可以直接不设置download属性(前提是后端响应头的Content-Type: application/octet-stream,如果为application/pdf浏览器则会判断文件为 pdf ,自动执行预览的策略)

同时,axios响应拦截器应该如下配置:

javascript 复制代码
// 响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse) => {
    // 如果是下载文件,直接返回data就行了
    if (response.headers['content-type'] === "application/octet-stream") {
      return response.data
    }
    ...
  }
}

最终,在进行下载文件的地方

javascript 复制代码
// 点击下载
const clickDownload = async () => {
  if (props.nowType !== KnowledgeType.RecycleBin) {
    try {
      const res = await downloadDoc(knowledgeStore.knowledgeList[props.item].id)
      download(docName, res)
    } catch {
      ElMessage.error('下载失败')
    }
  }
}

顺带一提上传文件的方法:设置'Content-Type': 'multipart/form-data'即可,然后表单参数里放文件

javascript 复制代码
export const postUpload = (data: File) => {
  return request.post('/upload', {
    file: data
  }, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  })
}
相关推荐
沛沛rh4541 分钟前
React 学习笔记:State、hook —— 组件的记忆
前端·javascript·react.js
0和1的舞者8 小时前
Spring AOP详解(一)
java·开发语言·前端·spring·aop·面向切面
web小白成长日记8 小时前
在Vue样式中使用JavaScript 变量(CSS 变量注入)
前端·javascript·css·vue.js
QT 小鲜肉8 小时前
【Linux命令大全】001.文件管理之which命令(实操篇)
linux·运维·服务器·前端·chrome·笔记
C_心欲无痕8 小时前
react - useImperativeHandle让子组件“暴露方法”给父组件调用
前端·javascript·react.js
BullSmall10 小时前
支持离线配置修改及删除操作的实现方案
前端
全栈前端老曹11 小时前
【前端路由】Vue Router 嵌套路由 - 配置父子级路由、命名视图、动态路径匹配
前端·javascript·vue.js·node.js·ecmascript·vue-router·前端路由
EndingCoder11 小时前
安装和设置 TypeScript 开发环境
前端·javascript·typescript
张雨zy12 小时前
Vue 项目管理数据时,Cookie、Pinia 和 LocalStorage 三种常见的工具的选择
前端·javascript·vue.js
五月君_12 小时前
Nuxt UI v4.3 发布:原生 AI 富文本编辑器来了,Vue 生态又添一员猛将!
前端·javascript·vue.js·人工智能·ui