import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import javax.servlet.http.HttpServletResponse; import org.springframework.util.StringUtils; /** * 返回文件流到瀏覽器 */ public class ResponseFileUtil { /** * 返回前臺文件流進行展現 * * @param filePath 要返回的文件具體路徑 * @param contentType 例如:"image/png" * @param response */ public static void responseFileForShow(String filePath, String contentType, HttpServletResponse response) throws Exception { ResponseFileUtil.responseFile(filePath, contentType, false, response); } /** * 返回前臺文件流進行下載 * * @param filePath 要返回的文件具體路徑 * @param contentType 例如:"application/x-download;charset=utf-8" * @param response */ public static void responseFileForLoad(String filePath, String contentType, HttpServletResponse response) throws Exception { ResponseFileUtil.responseFile(filePath, contentType, true, response); } /** * 使用response返回文件流 * * @param filePath 要返回的文件具體路徑 * @param contentType contentType類型 * 例如:"application/x-download;charset=utf-8" * 例如:"image/png" * @param isLoad true時下載,false時展現 * @param response 藉助response進行流的返回 */ public static void responseFile(String filePath, String contentType, boolean isLoad, HttpServletResponse response) throws Exception { // 聲明工具類 BufferedInputStream in = null; BufferedOutputStream out = null; try { // 若路徑爲空 if (StringUtils.isEmpty(filePath)) { throw new Exception("invalid filepath of null."); } // 沒找到文件 File file = new File(filePath); if (!file.exists()) { throw new Exception("file not exist in path [" + filePath + "]"); } // 輸出文件流到瀏覽器 in = new BufferedInputStream(new FileInputStream(filePath)); out = new BufferedOutputStream(response.getOutputStream()); // 設置MineType類型 response.setContentType(contentType); // 若是是下載,指定文件名稱 if (isLoad) { String fileName = file.getName(); // 獲取文件名 response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); } byte[] buffer = new byte[8192]; int count = 0; while ((count = in.read(buffer, 0, 8192)) != -1) { out.write(buffer, 0, count); } out.flush(); file = null; } catch (Exception e) { throw e; } finally { // 關閉輸入輸出流 closeStream(in, out); } } /** * 關閉輸入輸出流 */ public static void closeStream(InputStream in, OutputStream out) { if (null != in) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != out) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }