紙上得來終覺淺,絕知此事要躬行!今天部落客分享是關於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();
#
以上是有關解說Java Web的回應下載方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!