您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)JavaWeb項(xiàng)目中怎么實(shí)現(xiàn)一個(gè)響應(yīng)式下載功能,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
主要部分的代碼
<a href = "${pageContext.request.contextPath }/user/courseTab">模板下載</a>
當(dāng)然,現(xiàn)在的項(xiàng)目大家都使用框架,這里我使用的是(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工具類(lèi)是我自己寫(xiě)的,下來(lái)我粘到文章中
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:文件下載工具類(lèi) * @author ChoviWu * @date 2017年6月18日 下午2:44:17 * @version V1.0 */ public class DownUtil { /** * * @Description: * @param @param response * @param @param url 文件在數(shù)據(jù)庫(kù)的路徑 * @param @param base 文件存放的基礎(chǔ)路徑 * @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 { // 文件的名稱(chēng) 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();// 文件的長(zhǎng)度 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; // 寫(xiě)文件 while (-1 != (bytesread = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesread); } // 跳轉(zhuǎn)的路徑 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 模板名稱(chēng) * @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();// 文件的長(zhǎng)度 System.out.println("文件的長(zhǎng)度:" + 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; // 寫(xiě)文件 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!"); } } } }
下來(lái),我說(shuō)一下,調(diào)用的downMb,我們都知道,在服務(wù)器上下載一個(gè)文件,
//設(shè)置響應(yīng)頭,控制瀏覽器下載該文件,形參調(diào)的是文件的長(zhǎng)度 response.setHeader("Content-Length", String.valueOf(fileLength)); //設(shè)置響應(yīng)類(lèi)型,設(shè)置輸出流類(lèi)型 response.setContentType("application/octet-stream;charset=utf-8"); // 改成輸出excel文件
這里我使用的是輸出的Excel文件
接下來(lái)就是讀文件,寫(xiě)文件了,相信學(xué)了java基礎(chǔ)的都會(huì)接觸IO吧,這里我就略過(guò)
BufferedInputStream bis = null; BufferedOutputStream bos = null;
這里使用的是緩沖流,因其使用的是瀏覽器打開(kāi)文件的下載
下來(lái)就是寫(xiě)文件了,寫(xiě)文件也是一貫的套路,先把文件存到buff數(shù)據(jù)緩沖區(qū),然后將buff的數(shù)據(jù)輸出到瀏覽器供用戶(hù)查看
byte[] buff = new byte[2048]; int bytesread; // 寫(xiě)文件 while (-1 != (bytesread = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesread); }
當(dāng)讀寫(xiě)完文件之后,千萬(wàn)別忘了要關(guān)閉文件流(當(dāng)然,關(guān)閉流的順序也不能變)
fis.close(); bis.close(); bos.close();
看完上述內(nèi)容,你們對(duì)JavaWeb項(xiàng)目中怎么實(shí)現(xiàn)一個(gè)響應(yīng)式下載功能有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。