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("下载中药饮片导入模板失败,请联系管理员!");
		}
	}
相关推荐
小江的记录本9 分钟前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji341616 分钟前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
luanma15098018 分钟前
PHP vs C++:编程语言终极对决
开发语言·c++·php
寂静or沉默21 分钟前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
卓怡学长22 分钟前
m289在线交友系统
java·spring·tomcat·maven·intellij-idea·hibernate
kyriewen111 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript
娇娇yyyyyy2 小时前
QT编程(18): Qt QItemSelectionModel介绍
开发语言·qt
zhglhy2 小时前
Java分库分表技术对比分析
java·分库分表
wuyikeer2 小时前
Spring Framework 中文官方文档
java·后端·spring
豆豆的java之旅2 小时前
软考中级软件设计师 数据结构详细知识点(含真题+练习题,可直接复习)
java·开发语言·数据结构