【工具类】接口处理下载导出等文件流输出需求

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import lombok.SneakyThrows;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.net.URLEncoder;
import java.util.Map;

/**
 * 文件流输出工具类
 *
 * @author jason
 */
public class DownloadUtil {
    
    

    /**
     * 下载文件
     *
     * @ type         文件类型,默认octet-stream
     * @ filePath     文件路径
     * @ originalName 文件原名
     */
    @SneakyThrows
    public static void base(HttpServletResponse response, Map<Object, Object> param) {
    
    
        String type = (String) param.get("type");
        String filePath = (String) param.get("filePath");
        String originalName = (String) param.get("originalName");

        if (!FileUtil.exist(filePath)) {
    
    
            return;
        }

        response.reset();
        if (StrUtil.isBlank(type)) {
    
    
            type = "octet-stream";
        }
        response.setContentType("application/" + type);
        response.addHeader("Content-Disposition", "attachment; filename=" + URLUtil.encode(originalName));

		// 使用 try-with-resources 自动关闭流
        try (
                // 读到流中
		        FileInputStream inputStream = new FileInputStream(filePath);// 文件的存放路径
                ServletOutputStream outputStream = response.getOutputStream()
        ) {
    
    
            byte[] cache = new byte[1024];
            int len;
            while ((len = inputStream.read(cache)) > 0) {
    
    
                outputStream.write(cache, 0, len);
                outputStream.flush();
            }
        } // 这里会自动调用 close(),确保资源释放
    }

    /**
     * 下载文件-通用
     *
     * @param filePath     文件路径
     * @param originalName 文件原名
     */
    public static void down(HttpServletResponse response, String filePath, String originalName) {
    
    
        Map<Object, Object> param = MapUtil.of(new String[][]{
    
    
                {
    
    "filePath", filePath},
                {
    
    "originalName", originalName}
        });
        base(response, param);
    }

    /**
     * 下载文件-zip
     *
     * @param filePath     文件路径
     * @param originalName 文件原名
     */
    public static void zip(HttpServletResponse response, String filePath, String originalName) {
    
    
        Map<Object, Object> param = MapUtil.of(new String[][]{
    
    
                {
    
    "type", "zip"},
                {
    
    "filePath", filePath},
                {
    
    "originalName", originalName}
        });
        base(response, param);
    }

}