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


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

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

    效果图

    请添加图片描述


    请添加图片描述

    上代码

    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();
                    }
                }
            }
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98

    controller层

        @RequestMapping("/downloadTemplate")
        public void downloadTemplate(HttpServletRequest request, HttpServletResponse response) {
            breedInfoService.downloadTemplate(request, response);
        }
    
    • 1
    • 2
    • 3
    • 4

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

    	@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("下载中药饮片导入模板失败,请联系管理员!");
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    spring boot课程评价系统 毕业设计源码211004
    【论文笔记】—低光图像增强—Supervised—URetinex-Net—2022-CVPR
    pytest + yaml 框架 -62.支持yaml和json2种格式用例
    【计算机网络】超详细——VLAN、Trunk的配置
    “计算机艺术之父”、现代计算机技术先驱查理斯·苏黎去世,享年99岁
    Python报错“ImportError:most likely due to a circular import“记录
    普乐蛙VR航天航空巡展项目来到了第七站——绵阳科博会
    java(通过反射操作对象)
    开启金融之门,一切皆有可能——人大女王金融硕士项目助您成就辉煌
    flutter中使用缓存
  • 原文地址:https://blog.csdn.net/weixin_44842613/article/details/133792881