package jnpf.util; import cn.hutool.core.net.URLEncodeUtil; import jnpf.constant.GlobalConst; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springframework.http.MediaTypeFactory; import jakarta.servlet.http.HttpServletResponse; import org.springframework.util.StreamUtils; import java.io.*; @Slf4j public class FileDownloadUtil { /** * 下载文件 * * @param fileName 订单信息.pdf */ public static void outFile(InputStream inputStream, String fileName) { HttpServletResponse response = ServletUtil.getResponse(); //设置文件写出头部 setDownloadHeader(response, fileName); //写出文件 try { StreamUtils.copy(inputStream, response.getOutputStream()); } catch (IOException e) { log.error("写出文件失败, {}, {}, {}", fileName, e.getMessage()); } } /** * 下载文件 * * @param bytes * @param fileName 订单信息.pdf */ public static void outFile(byte[] bytes, String fileName) { HttpServletResponse response = ServletUtil.getResponse(); //设置文件写出头部 setDownloadHeader(response, fileName); //设置文件大小 response.setContentLength(bytes.length); //写出文件 try { StreamUtils.copy(bytes, response.getOutputStream()); } catch (IOException e) { log.error("写出文件失败, {}, {}, {}", fileName, e.getMessage()); } } /** * 显示文件 */ public static void flushFile(InputStream inputStream, String fileName) { HttpServletResponse response = ServletUtil.getResponse(); setFlushHeader(response, fileName); //写出文件 try { StreamUtils.copy(inputStream, response.getOutputStream()); } catch (IOException e) { log.error("写出图片失败, {}, {}", fileName, e.getMessage()); } } /** * 显示文件 */ public static void flushFile(byte[] bytes, String fileName) { if(bytes == null || bytes.length == 0) { return; } HttpServletResponse response = ServletUtil.getResponse(); setFlushHeader(response, fileName); //设置文件大小 response.setContentLength(bytes.length); //写出文件 try { StreamUtils.copy(bytes, response.getOutputStream()); } catch (IOException e) { log.error("写出图片失败, {}, {}", fileName, e.getMessage()); } } /** * 下载文件 * * @param fileName 订单信息.pdf */ public static void setDownloadHeader(HttpServletResponse response, String fileName) { //设置文件类型 setFlushHeader(response, fileName); //编码的文件名字,关于中文乱码的改造 // String codeFileName = fileName; // String agent = request.getHeader("USER-AGENT").toLowerCase(); // if (-1 != agent.indexOf("mozilla")) { // //火狐,谷歌 //// codeFileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1"); // } response.setHeader("Content-Disposition", "attachment;filename=" + URLEncodeUtil.encode(fileName, GlobalConst.DEFAULT_CHARSET)); } /** * 下载文件 * * @param fileName 订单信息.pdf */ public static void setFlushHeader(HttpServletResponse response, String fileName) { //设置文件类型 if (fileName != null && MediaTypeFactory.getMediaType(fileName).isPresent()) { response.setContentType(MediaTypeFactory.getMediaType(fileName).orElse(MediaType.ALL).toString()); } response.setCharacterEncoding("UTF-8"); } }