当前位置: 首页 > news >正文

axios同一个接口,同时接收 文件 或者 数据

1、前端代码

const service = axios.create({baseURL: "http://192.168.2.200:8080/api",timeout: 180000
})// 响应拦截
service.interceptors.response.use(async response => {if(response){// 请求时设置返回blob, 但是实际上可能返回的是json的情况if (response.data instanceof Blob) {if (!response.headers['content-type']?.includes('application/json')) {let a = document.createElement("a");a.setAttribute("href", URL.createObjectURL(response.data));a.setAttribute("download", decodeURI(response.headers['filename']));a.setAttribute("target", "_blank");a.click()return null}// 将后台返回的内容转成文本response.data = JSON.parse(await (response.data).text())}return response.data
}, err)

 主要是:if (response.data instanceof Blob)  判断是否是 Blob 对象,

否则使用:response.data = JSON.parse(await (response.data).text()) 将后台返回的内容转成 文本 返回

const formData = new FormData();
formData.append('id', 1);
formData.append('file', _file.file);const config = {headers: { 'Content-Type': 'multipart/form-data' },responseType: 'blob'
}axios.post('/file/upload', formData, config).then((res: any) => {if (res != null && res.code == 200) {alert("上传成功");} else {alert("上传失败");}})

主要是:responseType: 'blob'

2、后端代码


@Controller
@RequestMapping("api/file")
public class FileController {@PostMapping("upload")public void upload(MultipartFile file, HttpServletResponse response) {// 缓存文件String tmpDirPath = FileUtil.getTmpDirPath();// 上传文件名String originalFilename = file.getOriginalFilename();String targetFile = tmpDirPath + File.separator + originalFilename;FileUtil.writeFromStream(file.getInputStream(), targetFile);// 解析文件boolean result = parseFile(targetFile);if(!result){// 解析失败,返回失败文件InputStream in = new FileInputStream(targetFile);String filename = "解析失败_" + System.currentTimeMillis() + "_" + originalFilename;// 告诉浏览器输出内容为流response.setContentType("application/octet-stream;charset=utf-8");// 前端下载时的文件名response.setHeader("filename", URLEncoder.encode(filename, "UTF-8"));// 响应报头 指示哪些报头可以 公开 为通过列出他们的名字的响应的一部分。要公开多个自定义标题,可以用逗号分隔// 默认情况下,只显示6个简单的响应头 Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragmaresponse.setHeader("Access-Control-Expose-Headers", "filename");IOUtils.copy(in, response.getOutputStream());} else {response.setContentType("application/json;charset=utf-8");JSONObject jsonObject = new JSONObject();jsonObject.put("code", 200);jsonObject.put("message", "成功");response.getWriter().write(jsonObject.toJSONString());}// 删除临时文件FileUtil.del(targetFile);}}

需要注意的是:response.setHeader("Access-Control-Expose-Headers", "filename");

否则前端读取不到 response.headers['filename'] 的值

http://www.lryc.cn/news/126655.html

相关文章:

  • 【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云
  • 算法通关村第九关 | 二叉树查找和搜索树原理
  • jenkins gitlab 安装
  • Vue2(组件开发)
  • (二)结构型模式:8、代理模式(Proxy Pattern)(C++示例)
  • 代码审计-ASP.NET项目-未授权访问漏洞
  • 爬虫逆向实战(十四)--某培训平台登录
  • GT Code - 图译算法编辑器(集成QT、C++、C、Linux、Git、java、web、go、高并发、服务器、分布式、网络编程、云计算、大数据项目)
  • # 快速评估立功科技基于S32K324的TMS方案
  • docker+haror
  • Shell编程——弱数据类型的脚本语言快速入门指南
  • iOS textView支持超链接跳转
  • 大牛分析相机镜头光学中疑难问题
  • xacro机器人模型文件转urdf文件怎么编写launch文件启动gazebo仿真和在rviz2内显示模型
  • 前端图片转base64,并使用canvas对图片进行压缩
  • 电脑键盘打不了字按哪个键恢复?最新分享!
  • ue5读取外部文件
  • 【ARM】Day4 点亮LED灯
  • TiDB基础介绍、应用场景及架构
  • 深入学习前端开发,掌握HTML、CSS、JavaScript等技术
  • python编程小游戏 五子棋,python编程小游戏简单的
  • spring ico容器 spring注入方式 spring与tomcat整合
  • ansible 修改远程主机nginx配置文件
  • EV 录屏修复小工具
  • 蓝牙资讯|中国智能家居前景广阔,蓝牙Mesh照明持续火爆
  • 2023年排行前五的大规模语言模型(LLM)
  • DoIP学习笔记系列:(六)满足AES128-CMAC算法的“安全认证”.dll生成实践
  • Collections操作集合的工具类,可变参数、集合操作的工具类
  • Linux Kernel:进程表示
  • 黑马项目一阶段面试58题 苍穹外卖具体技术细节9题