JavaWeb響應下載(包含工具類)
阿新 • • 發佈:2017-07-11
文件的 瀏覽器下載 後綴 寫文件 部分 https res 文件路徑 form
紙上得來終覺淺,絕知此事要躬行!今天博主分享是關於javaweb的響應(response)下載
以下是我的Demo:
頁面我就粘主要部分的代碼
<a href = "${pageContext.request.contextPath }/user/courseTab">模板下載</a>
當然,現在的項目大家都使用框架,這裏我使用的是(SSM),好了,粘代碼
@Controller @RequestMapping("/user") public class UploadController { @RequestMapping(value="/courseTab",method=RequestMethod.GET) public void courseTab(HttpServletResponse response,HttpServletRequest request) throws IOException{ String path = request.getSession().getServletContext().getRealPath("/courseTab/課表上傳模板.xls"); DownUtil.downMb(response, path, "課表模板"+DateFormat.formatSimple(new Date())); } }
這裏我使用的DownUtil工具類是我自己寫的,下來我粘到文章中
package org.cxxy.base.cxsc.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletResponse; /** * @Title: DownUtil.java * @Package org.cxxy.base.cxsc.util * @Description:文件下載工具類 * @author ChoviWu * @date 2017年6月18日 下午2:44:17 * @version V1.0 */ public class DownUtil { /** * * @Description: * @param @param response * @param @param url 文件在數據庫的路徑 * @param @param base 文件存放的基礎路徑 * @param @param folderPath 上傳所在的文件夾 * @param @return * @param @throws IOException * @return int * @throws */ @SuppressWarnings("unused") public static int downFile(HttpServletResponse response, String url, Integer down, String base, String folderPath) throws IOException { // 文件的名稱 String fileName = url.split("/")[1]; System.out.println(fileName); // 文件的後綴 String last = url.substring(url.lastIndexOf(".") + 1); System.out.println(last); // 文件路徑 String downFilePath = base + folderPath + fileName; Long fileLength = new File(downFilePath).length();// 文件的長度 if (fileLength != 0) { response.reset(); response.setContentType("application/octet-stream;charset=utf-8"); // 改成輸出excel文件 try { response.setHeader( "Content-disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1")); response.setHeader("Content-Length", String.valueOf(fileLength)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } BufferedInputStream bis = null; BufferedOutputStream bos = null; FileInputStream fis = null; try { fis = new FileInputStream(downFilePath); bis = new BufferedInputStream(fis); // 輸出流 bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesread; // 寫文件 while (-1 != (bytesread = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesread); } // 跳轉的路徑 fis.close(); bis.close(); bos.close(); } catch (FileNotFoundException e) { System.out.println("File is Not Exsist!"); } } else { // 拋異常 response.getWriter() .write("<script charset=‘utf-8‘ type=‘text/javascript‘>alert(‘該資源不存在!‘);history.go(-1);</script>"); return down; } down++; return down; } /** * * @Description: 下載的模板 * @param @param response * @param @param path 路徑名 * @param @param name 模板名稱 * @param @throws IOException * @return void * @throws */ @SuppressWarnings("unused") public static void downMb(HttpServletResponse response, String path, String name) throws IOException { Long fileLength = new File(path).length();// 文件的長度 System.out.println("文件的長度:" + fileLength); if (fileLength != 0) { response.reset(); response.setContentType("application/octet-stream;charset=utf-8"); // 改成輸出excel文件 try { response.setHeader( "Content-disposition", "attachment; filename=" + new String(name.getBytes("utf-8"), "ISO8859-1")); response.setHeader("Content-Length", String.valueOf(fileLength)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } BufferedInputStream bis = null; BufferedOutputStream bos = null; FileInputStream fis = null; try { fis = new FileInputStream(path); bis = new BufferedInputStream(fis); // 輸出流 bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesread; // 寫文件 while (-1 != (bytesread = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesread); } fis.close(); bis.close(); bos.close(); } catch (FileNotFoundException e) { System.out.println("File is Not Exsist!"); } } } }
下來,我說一下,調用的downMb,我們都知道,在服務器上下載一個文件,
//設置響應頭,控制瀏覽器下載該文件,形參調的是文件的長度
response.setHeader("Content-Length", String.valueOf(fileLength));
//設置響應類型,設置輸出流類型
response.setContentType("application/octet-stream;charset=utf-8"); // 改成輸出excel文件
這裏我使用的是輸出的Excel文件
接下來就是讀文件,寫文件了,相信學了java基礎的都會接觸IO吧,這裏我就略過
BufferedInputStream bis = null; BufferedOutputStream bos = null;
這裏使用的是緩沖流,因其使用的是瀏覽器打開文件的下載
下來就是寫文件了,寫文件也是一貫的套路,先把文件存到buff數據緩沖區,然後將buff的數據輸出到瀏覽器供用戶查看
byte[] buff = new byte[2048];
int bytesread;
// 寫文件
while (-1 != (bytesread = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesread);
}
當讀寫完文件之後,千萬別忘了要關閉文件流(當然,關閉流的順序也不能變)
fis.close();
bis.close();
bos.close();
JavaWeb響應下載(包含工具類)