Java从resources文件下载文档,文档没有后缀名

业务场景:因为公司会对excel文档加密,通过svn或者git上传代码也会对文档进行加密,所以这里将文档后缀去了,这样避免文档加密。

实现思路:将文档去掉后缀,放入resources下,获取输入流,最后加上后缀,前端成功下载

效果图

上代码

java 复制代码
package com.***.util;

import cn.hutool.core.util.StrUtil;
import org.springframework.core.io.ClassPathResource;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

/**
 * @author longwei
 * @Description excel帮助类
 * @date 2023/8/30 14:36
 */
public class ExcelUtils {

    /**
     * 从静态资源下载文件
     *
     * @param fileName 文件名,没有后缀
     * @param suffix   文件后缀
     * @param request  request
     * @param response response
     */
    public static void downloadFileByLocalPath(HttpServletRequest request, HttpServletResponse response,
                                               String fileName, String suffix) throws Exception {
        if (StrUtil.isEmpty(fileName) || StrUtil.isEmpty(suffix)) {
            throw new RuntimeException("文件信息不能为空");
        }
        InputStream inputStream = new ClassPathResource("file" + File.separator + fileName).getInputStream();
        fileName = fileName + suffix;
        downFileByInputStream(request, response, inputStream, fileName);
    }

    public static void downFileByInputStream(HttpServletRequest request, HttpServletResponse response, InputStream inputStream, String fileName) throws Exception {
        byte[] buffer = new byte[1024];
        BufferedInputStream bis = null;
        OutputStream os = null;
        String finalFileName;
        try {
            final String userAgent = request.getHeader("USER-AGENT");
            //IE浏览器
            if (StrUtil.contains(userAgent, "MSIE") || StrUtil.contains(userAgent, "Trident")) {
                finalFileName = URLEncoder.encode(fileName, "UTF8");
            }
            //google,火狐浏览器
            else if (StrUtil.contains(userAgent, "Mozilla")) {
                finalFileName = new String(fileName.getBytes(), "ISO8859-1");
            }
            //其他浏览器
            else {
                finalFileName = URLEncoder.encode(fileName, "UTF8");
            }
            response.setCharacterEncoding("UTF-8");
            // 设置强制下载不打开
            response.setContentType("application/force-download");
            // 设置文件名
            response.addHeader("Content-Disposition", "attachment;fileName=" + finalFileName);
            bis = new BufferedInputStream(inputStream);
            os = response.getOutputStream();
            int i = bis.read(buffer);
            while (i != -1) {
                os.write(buffer, 0, i);
                i = bis.read(buffer);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (bis != null) {
                try {
                    bis.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (os != null) {
                try {
                    os.flush();
                    os.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

controller层

java 复制代码
    @RequestMapping("/downloadTemplate")
    public void downloadTemplate(HttpServletRequest request, HttpServletResponse response) {
        breedInfoService.downloadTemplate(request, response);
    }

service.impl层,这里直接用ExcelUtils方法

java 复制代码
	@Override
	public void downloadTemplate(HttpServletRequest request, HttpServletResponse response) {
		String fileName = "中药饮片导入模板";
		try {
			ExcelUtils.downloadFileByLocalPath(request, response, fileName, ".xlsx");
		} catch (Exception e) {
			log.error("下载中药饮片导入模板失败-{}", e.getMessage());
			throw new BusinessException("下载中药饮片导入模板失败,请联系管理员!");
		}
	}
相关推荐
a程序小傲6 分钟前
饿了吗Java面试被问:Redis的持久化策略对比(RDBVS AOF)
java·redis·面试
我家领养了个白胖胖13 分钟前
MCP模型上下文协议 Model Context Protocol & 百度地图MCP开发
java·后端·ai编程
Coder_Boy_15 分钟前
基于DDD+Spring Boot 3.2+LangChain4j构建企业级智能客服系统
java·人工智能·spring boot·后端
黄俊懿22 分钟前
【深入理解SpringCloud微服务】Spring-Security作用与原理解析
java·后端·安全·spring·spring cloud·微服务·架构师
a程序小傲29 分钟前
阿里Java面试被问:.Java 8中Stream API的常用操作和性能考量
开发语言·windows·python
塔能物联运维30 分钟前
设备自适应采样率忽视能耗致续航降 后来结合功耗模型动态调优
java·后端·struts
rchmin38 分钟前
Spring Boot自动装配原理解析
java·spring boot·后端
程序员小假1 小时前
我们来说一下 synchronized 与 ReentrantLock 的区别
java·后端
益达3211 小时前
【避坑指南】Maven依赖冲突怎么解决?用mvn dependency:tree一眼看清
java
爱装代码的小瓶子1 小时前
【c++进阶】从C++98到C++11的奇妙旅程(故事科普版)
开发语言·c++