将后端resources中的文件返给前端下载的方法

//后端

java 复制代码
@GetMapping("getmoban")
// 下载模板
    public AppResult<String> getmoban(HttpServletResponse response) {
        // 尝试-with-resources确保流会被自动关闭
        try (InputStream resourceAsStream = this.getClass().getResourceAsStream("/excelTemplates/importQualificationAbilityExcel.xlsx");
             ServletOutputStream out = response.getOutputStream()) {

            if (resourceAsStream == null) {
                return AppResultBuilder.error(500, "模板文件不存在");
            }

            // 设置响应头信息
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment; filename=\"" +
                    URLEncoder.encode("导入excel模板.xlsx", "UTF-8") + "\"");
            // 有些浏览器需要此头信息
            response.setHeader("filename", URLEncoder.encode("导入excel模板.xlsx", "UTF-8"));

            byte[] buffer = new byte[1024];
            int len;
            while ((len = resourceAsStream.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
            out.flush(); // 确保所有数据都被写出

            return AppResultBuilder.success("下载成功.");

        } catch (UnsupportedEncodingException e) {
            return AppResultBuilder.error(500, "编码错误: " + e.getMessage());
        } catch (IOException e) {
            return AppResultBuilder.error(500, "文件读写错误: " + e.getMessage());
        }
    }

前端

html 复制代码
/**
 * 二进制文件下载工具(优化版)
 * @param binFile 二进制文件流(Blob对象)
 * @param fileName 保存的文件名
 * @param blobType MIME类型,默认为excel类型
 */
export const downloadBinaryFile = (
  binFile: Blob,
  fileName: string,
  blobType = 'application/vnd.ms-excel',
) => {
  // 确保传入的是Blob对象,避免类型错误
  if (!(binFile instanceof Blob)) {
    console.error('无效的二进制文件流')
    return
  }

  // 创建URL对象
  const url = window.URL.createObjectURL(new Blob([binFile], { type: blobType }))
  const a = document.createElement('a')
  a.href = url
  a.download = fileName // 设置文件名(支持中文)

  // 触发下载
  document.body.appendChild(a)
  a.click()

  // 清理资源
  document.body.removeChild(a)
  window.URL.revokeObjectURL(url) // 释放URL对象,避免内存泄漏
}
html 复制代码
import { downloadBinaryFile } from '@/utils/helpUtils.ts'

/**
 * 下载模板文件(修改后的版本)
 * @returns 无返回值,直接触发浏览器下载
 */
export const downloadimportFile = async () => {
  try {
    // 关键:设置responseType为blob,告知axios接收二进制流
    const result: AxiosResponse<Blob> = await axios({
      method: 'get',
      url: '/api/job/qualification/getmoban',
      responseType: 'blob', // 必须设置,否则会解析为JSON导致乱码
      timeout: 60000, // 加大超时时间,避免大文件下载超时
    })

    // 从响应头获取文件名(后端设置的filename)
    const contentDisposition = result.headers['content-disposition'] || ''
    let fileName = '' // 默认文件名

    // 解析响应头中的文件名(处理编码问题)
    if (contentDisposition) {
      const match = contentDisposition.match(/filename="(.*?)"/)
      if (match && match[1]) {
        fileName = decodeURIComponent(match[1]) // 解码URLEncoded的文件名
      }
    }
    // 调用下载工具方法处理二进制流
    downloadBinaryFile(result.data, fileName)
    return { success: true } // 返回成功状态给调用方
  } catch (error: any) {
    if (isCustomAxiosError(error)) {
      console.error('文件下载失败:', error.message)
    } else {
      console.error('文件下载异常:', error)
    }
    return { success: false, msg: '文件下载失败' }
  }
}
相关推荐
福兮说5 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理5 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆6666 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
Dovis(誓平步青云)6 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan7 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_7 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒8 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技8 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu9 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
默_笙9 小时前
🛴 从散件到整机:DeepAgents 与 Agent 身上预留的那些"插槽"(前置介绍)
前端·javascript