DownUtil.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. package jnpf.util;
  2. import jnpf.constant.MsgCode;
  3. import lombok.Cleanup;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.apache.poi.ss.usermodel.Workbook;
  6. import javax.imageio.ImageIO;
  7. import jakarta.servlet.ServletOutputStream;
  8. import jakarta.servlet.http.HttpServletRequest;
  9. import jakarta.servlet.http.HttpServletResponse;
  10. import java.awt.image.BufferedImage;
  11. import java.io.*;
  12. import java.net.URLEncoder;
  13. import java.nio.charset.StandardCharsets;
  14. /**
  15. * @author JNPF开发平台组
  16. * @version V3.1.0
  17. * @copyright 引迈信息技术有限公司
  18. * @date 2021/3/16 10:51
  19. */
  20. @Slf4j
  21. public class DownUtil {
  22. /**
  23. * 下载excel
  24. *
  25. * @param fileName excel名称
  26. * @param workbook
  27. */
  28. public static void dowloadExcel(Workbook workbook, String fileName) {
  29. try {
  30. HttpServletResponse response = ServletUtil.getResponse();
  31. response.setCharacterEncoding(Constants.UTF8);
  32. response.setHeader("content-Type", "application/vnd.ms-excel");
  33. response.setHeader("Content-Disposition",
  34. "attachment;filename=" + URLEncoder.encode(fileName, Constants.UTF8));
  35. @Cleanup ServletOutputStream outputStream = response.getOutputStream();
  36. workbook.write(outputStream);
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. /**
  42. * 下载文件
  43. *
  44. * @param file 文件
  45. * @param fileName 订单信息.pdf
  46. */
  47. public static void dowloadFile(File file, String fileName) {
  48. HttpServletResponse response = ServletUtil.getResponse();
  49. HttpServletRequest request = ServletUtil.getRequest();
  50. try {
  51. @Cleanup InputStream is = new FileInputStream(file);
  52. @Cleanup BufferedInputStream bis = new BufferedInputStream(is);
  53. response.setCharacterEncoding("UTF-8");
  54. response.setContentType("application/x-download");
  55. //编码的文件名字,关于中文乱码的改造
  56. String codeFileName = "";
  57. String agent = request.getHeader("USER-AGENT").toLowerCase();
  58. if (-1 != agent.indexOf("msie") || -1 != agent.indexOf("trident")) {
  59. //IE
  60. codeFileName = URLEncoder.encode(fileName, "UTF-8");
  61. } else if (-1 != agent.indexOf("mozilla")) {
  62. //火狐,谷歌
  63. codeFileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
  64. } else {
  65. codeFileName = URLEncoder.encode(fileName, "UTF-8");
  66. }
  67. response.setHeader("Content-Disposition", "attachment;filename=\"" + codeFileName + "\"");
  68. @Cleanup OutputStream os = response.getOutputStream();
  69. int i;
  70. byte[] buff = new byte[1024 * 8];
  71. while ((i = bis.read(buff)) != -1) {
  72. os.write(buff, 0, i);
  73. }
  74. os.flush();
  75. } catch (Exception e) {
  76. e.printStackTrace();
  77. }
  78. }
  79. /**
  80. * 下载文件
  81. *
  82. * @param paths 路径
  83. * @param fileName 订单信息.pdf
  84. */
  85. public static void dowloadFile(String paths, String fileName) {
  86. HttpServletResponse response = ServletUtil.getResponse();
  87. HttpServletRequest request = ServletUtil.getRequest();
  88. try {
  89. @Cleanup InputStream is = new FileInputStream(new File(XSSEscape.escapePath(paths)));
  90. @Cleanup BufferedInputStream bis = new BufferedInputStream(is);
  91. response.setCharacterEncoding("UTF-8");
  92. response.setContentType("text/plain");
  93. if (fileName.endsWith(".pdf")) {
  94. response.setContentType("application/pdf");
  95. }
  96. if (fileName.contains(".svg")) {
  97. response.setContentType("image/svg+xml");
  98. }
  99. //编码的文件名字,关于中文乱码的改造
  100. String codeFileName = "";
  101. String agent = request.getHeader("USER-AGENT").toLowerCase();
  102. if (-1 != agent.indexOf("msie") || -1 != agent.indexOf("trident")) {
  103. //IE
  104. codeFileName = URLEncoder.encode(fileName, "UTF-8");
  105. } else if (-1 != agent.indexOf("mozilla")) {
  106. //火狐,谷歌
  107. codeFileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
  108. } else {
  109. codeFileName = URLEncoder.encode(fileName, "UTF-8");
  110. }
  111. response.setHeader("Content-Disposition", "attachment;filename=" + new String(codeFileName.getBytes(), "utf-8"));
  112. @Cleanup OutputStream os = response.getOutputStream();
  113. int i;
  114. byte[] buff = new byte[1024 * 8];
  115. while ((i = bis.read(buff)) != -1) {
  116. os.write(buff, 0, i);
  117. }
  118. os.flush();
  119. } catch (Exception e) {
  120. e.printStackTrace();
  121. }
  122. }
  123. /**
  124. * 显示验证码
  125. */
  126. public static void downCode(Integer stringLength) {
  127. HttpServletResponse response = DownUtil.getResponse();
  128. CodeUtil codeUtil = new CodeUtil();
  129. codeUtil.getRandcode(response, stringLength);
  130. }
  131. /**
  132. * 流返回界面
  133. */
  134. public static void write(BufferedImage image) {
  135. try {
  136. HttpServletResponse response = DownUtil.getResponse();
  137. //将内存中的图片通过流动形式输出到客户端
  138. ImageIO.write(image, "PNG", response.getOutputStream());
  139. } catch (Exception e) {
  140. e.getMessage();
  141. }
  142. }
  143. /**
  144. * 设置img的response
  145. */
  146. public static HttpServletResponse getResponse() {
  147. HttpServletResponse response = ServletUtil.getResponse();
  148. response.setCharacterEncoding("UTF-8");
  149. //设置相应类型,告诉浏览器输出的内容为图片
  150. response.setContentType("image/jpeg");
  151. //设置响应头信息,告诉浏览器不要缓存此内容
  152. response.setHeader("Pragma", "No-cache");
  153. response.setHeader("Cache-Control", "no-cache");
  154. response.setDateHeader("Expire", 0);
  155. return response;
  156. }
  157. /**
  158. * 显示预览的pdf
  159. */
  160. public static void dowloadFile(File file) {
  161. try {
  162. @Cleanup OutputStream outputStream = null;
  163. @Cleanup InputStream in = null;
  164. //读取指定路径下面的文件
  165. in = new FileInputStream(file);
  166. ServletUtil.getResponse().setContentType("application/pdf;charset=utf-8");
  167. //编码的文件名字,关于中文乱码的改造
  168. String codeFileName = "";
  169. String agent = ServletUtil.getRequest().getHeader("USER-AGENT").toLowerCase();
  170. if (-1 != agent.indexOf("msie") || -1 != agent.indexOf("trident")) {
  171. //IE
  172. codeFileName = URLEncoder.encode(file.getName(), "UTF-8");
  173. } else if (-1 != agent.indexOf("mozilla")) {
  174. //火狐,谷歌
  175. codeFileName = new String(file.getName().getBytes("UTF-8"), StandardCharsets.ISO_8859_1);
  176. } else {
  177. codeFileName = URLEncoder.encode(file.getName(), "UTF-8");
  178. }
  179. ServletUtil.getResponse().setHeader("Content-Disposition", "filename=" + codeFileName);
  180. outputStream = new BufferedOutputStream(ServletUtil.getResponse().getOutputStream());
  181. //创建存放文件内容的数组
  182. byte[] buff = new byte[1024];
  183. //所读取的内容使用n来接收
  184. int n;
  185. //当没有读取完时,继续读取,循环
  186. while ((n = in.read(buff)) != -1) {
  187. //将字节数组的数据全部写入到输出流中
  188. outputStream.write(buff, 0, n);
  189. }
  190. //强制将缓存区的数据进行输出
  191. outputStream.flush();
  192. } catch (Exception e) {
  193. e.getMessage();
  194. }
  195. }
  196. /**
  197. * 显示文件
  198. */
  199. public static void dowloadFile(String file) {
  200. try {
  201. HttpServletResponse response = ServletUtil.getResponse();
  202. @Cleanup ServletOutputStream outputStream1 = response.getOutputStream();
  203. @Cleanup OutputStream outputStream = null;
  204. @Cleanup InputStream in = null;
  205. //读取指定路径下面的文件
  206. in = new FileInputStream(file);
  207. outputStream = new BufferedOutputStream(outputStream1);
  208. //创建存放文件内容的数组
  209. byte[] buff = new byte[1024];
  210. //所读取的内容使用n来接收
  211. int n;
  212. //当没有读取完时,继续读取,循环
  213. while ((n = in.read(buff)) != -1) {
  214. //将字节数组的数据全部写入到输出流中
  215. outputStream.write(buff, 0, n);
  216. }
  217. //强制将缓存区的数据进行输出
  218. outputStream.flush();
  219. } catch (Exception e) {
  220. e.getMessage();
  221. }
  222. }
  223. /**
  224. * 下载svg
  225. *
  226. * @param file
  227. */
  228. public static void dowloadSvgFile(File file) {
  229. try {
  230. @Cleanup OutputStream outputStream = null;
  231. @Cleanup InputStream in = null;
  232. //读取指定路径下面的文件
  233. in = new FileInputStream(file);
  234. ServletUtil.getResponse().setContentType("image/svg+xml;charset=utf-8");
  235. //编码的文件名字,关于中文乱码的改造
  236. String codeFileName = "";
  237. String agent = ServletUtil.getRequest().getHeader("USER-AGENT").toLowerCase();
  238. if (-1 != agent.indexOf("msie") || -1 != agent.indexOf("trident")) {
  239. //IE
  240. codeFileName = URLEncoder.encode(file.getName(), "UTF-8");
  241. } else if (-1 != agent.indexOf("mozilla")) {
  242. //火狐,谷歌
  243. codeFileName = new String(file.getName().getBytes("UTF-8"), "iso-8859-1");
  244. } else {
  245. codeFileName = URLEncoder.encode(file.getName(), "UTF-8");
  246. }
  247. ServletUtil.getResponse().setHeader("Content-Disposition", "filename=" + codeFileName);
  248. outputStream = new BufferedOutputStream(ServletUtil.getResponse().getOutputStream());
  249. //创建存放文件内容的数组
  250. byte[] buff = new byte[1024];
  251. //所读取的内容使用n来接收
  252. int n;
  253. //当没有读取完时,继续读取,循环
  254. while ((n = in.read(buff)) != -1) {
  255. //将字节数组的数据全部写入到输出流中
  256. outputStream.write(buff, 0, n);
  257. }
  258. //强制将缓存区的数据进行输出
  259. outputStream.flush();
  260. } catch (Exception e) {
  261. e.getMessage();
  262. }
  263. }
  264. /**
  265. * 下载文件
  266. *
  267. * @param str
  268. * @param fileName
  269. */
  270. public static Boolean downloadFile(String str, String fileName) {
  271. HttpServletResponse response = ServletUtil.getResponse();
  272. HttpServletRequest request = ServletUtil.getRequest();
  273. OutputStream os = null;
  274. try {
  275. response.reset();
  276. response.setContentType("application/octet-stream; charset=utf-8");
  277. response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes(), "ISO8859-1"));
  278. byte[] bytes = str.getBytes("utf-8");
  279. os = response.getOutputStream();
  280. // 将字节流传入到响应流里,响应到浏览器
  281. os.write(bytes);
  282. os.close();
  283. return true;
  284. } catch (Exception ex) {
  285. log.error("导出失败:", ex);
  286. throw new RuntimeException(MsgCode.IMP005.get());
  287. } finally {
  288. try {
  289. if (null != os) {
  290. os.close();
  291. }
  292. } catch (IOException ioEx) {
  293. log.error("导出失败:", ioEx);
  294. }
  295. }
  296. }
  297. }