package com.yssh.utils; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.net.URLEncoder; import java.util.Date; /** * Web工具类 * @author WWW * @date 2023-08-09 */ public class WebUtils { /** * 字符点 */ public final static String POINT = "."; /** * 下载文件 * * @param file 文件 * @param fileName 文件名 * @param res 响应 * @throws Exception 异常 */ public static void download(String file, String fileName, boolean inline, HttpServletResponse res) throws Exception { if (StringUtils.isEmpty(fileName)) { fileName = DateUtils.parseDateToStr(DateUtils.YYYYMMDDHHMMSS, new Date()); } fileName = URLEncoder.encode(fileName, "UTF-8").replace("+", "%20"); String dispose = inline ? "inline" : "attachment"; // 设置响应头中文件的下载方式为附件方式,以及设置文件名 res.setHeader("Content-Disposition", dispose + "; filename*=UTF-8''" + fileName); // 设置响应头的编码格式为 UTF-8 res.setCharacterEncoding("UTF-8"); // 通过response对象设置响应数据格式(如:"text/plain; charset=utf-8") String ext = getExtension(file); String mime = getMime(ext); res.setContentType(mime); // 通过response对象,获取到输出流 ServletOutputStream outputStream = res.getOutputStream(); // 定义输入流,通过输入流读取文件内容 FileInputStream fileInputStream = new FileInputStream(file); int len = 0; byte[] bytes = new byte[1024]; while ((len = fileInputStream.read(bytes)) != -1) { // 通过输入流读取文件数据,然后通过上述的输出流写回浏览器 outputStream.write(bytes, 0, len); outputStream.flush(); } // 关闭资源 fileInputStream.close(); outputStream.close(); } /** * 获取文件扩展名 */ public static String getExtension(String fileName) { if (StringUtils.isEmpty(fileName)) { return ""; } int idx = fileName.lastIndexOf(POINT); if (idx == -1) { return ""; } return fileName.substring(idx).toLowerCase(); } /** * 获取多用途互联网邮件扩展类型 * * @param ext 文件扩展名 * @return MIME */ public static String getMime(String ext) { switch (ext) { // 图片 case ".tif": case ".tiff": return "image/tiff"; case ".img": return "application/x-img"; case ".gif": return "image/gif"; case ".jpg": case ".jpeg": return "image/jpeg"; case ".png": return "image/png"; // 音/视频 case ".mp3": return "audio/mp3"; case ".mp4": return "video/mpeg4"; case ".avi": return "video/avi"; case ".mpg": case ".mpeg": return "video/mpg"; case ".wav": return "audio/wav"; case ".wma": return "audio/x-ms-wma"; case ".swf": return "application/x-shockwave-flash"; case ".wmv": return "video/x-ms-wmv"; case ".rm": return "application/vnd.rn-realmedia"; case ".rmvb": return "application/vnd.rn-realmedia-vbr"; // 网页 case ".js": return "application/x-javascript"; case ".css": return "text/css"; case ".asp": return "text/asp"; case ".mht": return "message/rfc822"; case ".jsp": case ".htm": case ".html": case ".xhtml": return "text/html"; case ".xml": case ".svg": return "text/xml"; // 文件 case ".txt": return "text/plain"; case ".dbf": return "application/x-dbf"; case ".mdb": return "application/msaccess"; case ".pdf": return "application/pdf"; case ".ppt": case ".pptx": return "application/x-ppt"; case ".doc": case ".docx": return "application/msword"; case ".xls": case ".xlsx": return "application/vnd.ms-excel"; case ".dgn": return "application/x-dgn"; case ".dwg": return "application/x-dwg"; case ".ext": return "application/x-msdownload"; // 默认 default: return "application/octet-stream"; } } }