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("下载中药饮片导入模板失败,请联系管理员!");
		}
	}
相关推荐
天天摸鱼的java工程师1 小时前
别再写那些重复代码了!8年Java老兵教你用 Hutool 提升开发效率
java·后端
喝杯绿茶2 小时前
springboot中的事务
java·spring boot·后端
专注VB编程开发20年2 小时前
.NET Reflector反编绎,如何移除DLL中的一个公开属性
开发语言·c++·c#
麦兜*2 小时前
多阶段构建:打造最小化的 Spring Boot Docker 镜像
java·spring boot·后端·spring cloud·docker
oak隔壁找我2 小时前
Spring Boot Starter 入门教程
java·后端
YoungP2 小时前
【Effective Java 条目一】-- 用静态工厂方法替代构造器
java
高山上有一只小老虎2 小时前
求最大连续bit数
java·算法
vxiam14xxx2 小时前
【Java Swing 项目】java 聊天系统
java·开发语言·python
Dylan的码园2 小时前
以二叉树问题为基础的递归调试学习(上)
java·学习·算法·leetcode·r-tree
少许极端2 小时前
算法奇妙屋(九)-栈
java·数据结构·算法·