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

Vue3 中判断接口返回的是文件流还是 JSON 提示信息

需求:

前端上传一个Excel文件到后端,后端返回结果分以下两种情况:

  1. 返回的是可下载Excel文件,直接下载到本地
  2. 返回的是 JSON 格式的提示信息({ code: 200, message: “操作成功” })

实现代码

// 核心上传逻辑
const handleUpload = async (file) => {
  isUploading.value = true;
  message.value = '';
  
  try {
    const formData = new FormData();
    formData.append('file', file);

    const response = await axios.post('/api/upload', formData, {
      headers: { 'Content-Type': 'multipart/form-data' },
      responseType: 'blob'
    });

    // 根据Content-Type区分响应类型
    const contentType = response.headers['content-type'];
    const data = response.data;// 关键配置

    // 处理成功响应(JSON)
    if (contentType.includes('application/json')) {
      //解析blob中的信息
      const reader = new FileReader();
      reader.readAsText(data);
      reader.onload = () => {
        const result = JSON.parse(reader.result);
        messageType.value = 'success';
        message.value = `上传成功:${result.message}`;
        ElMessage.success(result.message || '文件处理完成');
      };
     
    }
    // 处理错误响应(Excel)
    else if (contentType.includes('application/vnd.ms-excel')) {
      handleErrorExcel(data);
      messageType.value = 'error';
      message.value = '存在错误数据,已生成错误文件';
      ElMessage.error('请下载错误文件修改后重新上传');
    }
  } catch (error) {
    // 处理网络/服务器错误
    handleRequestError(error);
  } finally {
    isUploading.value = false;
  }
};
// 处理错误Excel下载
const handleErrorExcel = (blobData) => {
  // 创建可下载链接
  const url = window.URL.createObjectURL(new Blob([blobData]));
  const link = document.createElement('a');
  link.href = url;
  // 获取文件名(从Content-Disposition中提取)
  const disposition = response.headers['content-disposition'];
  let filename = 'default-filename';
  if (disposition) {
    const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
    const matches = filenameRegex.exec(disposition);
    if (matches?.[1]) {
      filename = matches[1].replace(/['"]/g, '');
      //从URL获取的编码参数
      //filename =decodeURIComponent(matches[1].replace(/['"]/g, ''))  
    }
  }
  link.setAttribute('download', fileName);
  document.body.appendChild(link);
  link.click();
  
  // 清理资源
  document.body.removeChild(link);
  URL.revokeObjectURL(url);
};
http://www.dtcms.com/a/110087.html

相关文章:

  • UltraScale+系列FPGA实现 IMX214 MIPI 视频解码转HDMI2.0输出,提供2套工程源码和技术支持
  • 加固计算机厂家 | 工业加固笔记本电脑厂家
  • mybatis 自带的几个插入接口的区别
  • 激光加工中平面倾斜度的矫正
  • AI图片设计常用提示词分类表
  • Redis 主要能够用来做什么
  • 企业级日志分析平台: ELK 集群搭建指南
  • TypeScript工程集成
  • 【数据结构】邻接矩阵完全指南:原理、实现与稠密图优化技巧​
  • 位运算题目:数字范围按位与
  • 【系统分析师-第二篇】
  • SQL语句(二)—— DML
  • (DreamerV3)Mastering Diverse Domains through World Models
  • 《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
  • 3499 幸运数字
  • LeetCode 2140.解决智力问题:记忆化搜索(DFS) / 动态规划(DP)
  • 使用 React 和 Konva 实现一个在线画板组件
  • 前端对接下载文件接口、对接dart app
  • 【解决】VsCode中code runner无法使用cin 输入
  • 大学生机器人比赛实战(一)综述篇
  • 用树莓派和ads1115采样模拟量 保姆级教程
  • 基于CYT4BB MCAL完成对DS_SA47321功能开发
  • python match case语法
  • 2025年中级社会工作者考试模拟题
  • 大模型备案材料:评估测试题集真实案例详解
  • 基数排序算法解析与TypeScript实现
  • 《双影奇境》手机版上线?ToDesk用跨平台技术实现「全设备云电脑3A游戏」
  • liunx日志查询常用命令总结
  • Cesium 时间线 及 坐标转换
  • PyTorch复现逻辑回归