package com.zt.life.export.service; import com.deepoove.poi.XWPFTemplate; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xwpf.usermodel.XWPFDocument; import sun.misc.BASE64Encoder; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; public class DownloadService { /** * 导出Excel模板 * * @param response * @param fullPath * @param fileName */ public static void download(HttpServletResponse response, String fullPath, String fileName) { response.setContentType("text/html;charset=UTF-8"); BufferedInputStream bis = null; BufferedOutputStream bos = null; String contentType = "application/octet-stream"; try { response.setContentType(contentType); response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1")); byte[] buff = new byte[2048]; bis = new BufferedInputStream(new FileInputStream(fullPath)); bos = new BufferedOutputStream(response.getOutputStream()); int bytesRead; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } } catch (IOException e) { } finally { try { if (bis != null) { bis.close(); } if (bos != null) { bos.close(); } } catch (IOException e) { e.printStackTrace(); } } } // public static void download(HttpServletResponse response, XWPFDocument // document, String fileName) { // response.setContentType("text/html;charset=UTF-8"); // // String contentType = "application/octet-stream"; // try { // response.setContentType(contentType); // response.setHeader("Content-disposition", // "attachment; filename=" + new String(fileName.getBytes("utf-8"), // "ISO8859-1")); // ServletOutputStream out = response.getOutputStream(); // document.write(out); // out.flush(); // out.close(); // } catch (IOException e) { // } finally { // try { // document.close(); // } catch (IOException e) { // e.printStackTrace(); // } // } // // } public static void download(HttpServletRequest request, HttpServletResponse response, XWPFTemplate template, String fileName) throws UnsupportedEncodingException { // 处理ie浏览器 或 火狐浏览器 乱码问题 String fileNameEncoder = getNameEncoder(request, fileName); response.setContentType("text/html;charset=UTF-8"); String contentType = "application/octet-stream"; try { response.setContentType(contentType); response.setHeader("Content-disposition", "attachment; filename=" + fileNameEncoder); ServletOutputStream out = response.getOutputStream(); template.write(out); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { template.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void download(HttpServletRequest request, HttpServletResponse response, XWPFDocument document, String fileName) throws UnsupportedEncodingException { // 处理ie浏览器 或 火狐浏览器 乱码问题 String fileNameEncoder = getNameEncoder(request, fileName); response.setContentType("text/html;charset=UTF-8"); String contentType = "application/octet-stream"; try { response.setContentType(contentType); response.setHeader("Content-disposition", "attachment; filename=" + fileNameEncoder); ServletOutputStream out = response.getOutputStream(); document.write(out); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { document.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void downloadExecl(HttpServletResponse response, XSSFWorkbook template, String fileName) { response.setContentType("text/html;charset=UTF-8"); String contentType = "application/octet-stream"; try { response.setContentType(contentType); response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1")); ServletOutputStream out = response.getOutputStream(); template.write(out); out.flush(); out.close(); } catch (IOException e) { } finally { try { template.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 指定文件导出模板 * @param excelPath 模板路径 * @param excelName 导出模板名称 * @param response * @param request * @throws IOException */ public static void exportModelPath(String excelPath,String excelName,File file,HttpServletResponse response,HttpServletRequest request) throws IOException{ InputStream fis = new BufferedInputStream(new FileInputStream(excelPath)); int a = -1; byte[] bytes = new byte[fis.available()]; int index = 0; while ((a = fis.read()) > -1) { bytes[index] = (byte) a; index++; } response.reset(); //清空 response.setHeader("Content-Disposition", "attachment;filename=" + DownloadService.getNameEncoder(request, excelName)); response.addHeader("Content-Length", "" + file.length()); OutputStream ops = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); ops.write(bytes); fis.close(); ops.flush(); ops.close(); } /** * 处理ie浏览器 或 火狐浏览器 文件名乱码问题 * * @param request * @param fileName * @return * @throws UnsupportedEncodingException */ public static String getNameEncoder(HttpServletRequest request, String fileName) throws UnsupportedEncodingException { // 获得请求头中的User-Agent String agent = request.getHeader("User-Agent"); // 根据不同浏览器进行不同的编码 String fileNameEncoder = ""; if (agent.contains("MSIE") || agent.contains("Trident")) { // IE浏览器 fileNameEncoder = URLEncoder.encode(fileName, "utf-8"); fileNameEncoder = fileNameEncoder.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐浏览器 BASE64Encoder base64Encoder = new BASE64Encoder(); fileNameEncoder = "=?utf-8?B?" + base64Encoder.encode(fileName.getBytes("utf-8")) + "?="; } else { // 其它浏览器 fileNameEncoder = URLEncoder.encode(fileName, "utf-8"); } return fileNameEncoder; } /** * 导出Excel模板 * * @param response * @param fullPath * @param fileName */ public static void downloadZip(HttpServletResponse response, HttpServletRequest request, String fullPath, String fileName) { BufferedInputStream bis = null; BufferedOutputStream bos = null; try { // 处理ie浏览器 或 火狐浏览器 乱码问题 String fileNameEncoder = getNameEncoder(request, fileName); response.setContentType("text/html;charset=UTF-8"); String contentType = "application/octet-stream"; response.setContentType(contentType); response.setHeader("Content-disposition", "attachment; filename=" + fileNameEncoder); byte[] buff = new byte[2048]; bis = new BufferedInputStream(new FileInputStream(fullPath)); bos = new BufferedOutputStream(response.getOutputStream()); int bytesRead; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } } catch (IOException e) { } finally { try { if (bis != null) { bis.close(); } if (bos != null) { bos.close(); } } catch (IOException e) { e.printStackTrace(); } } } }