Java Web應(yīng)用程序?qū)崿F(xiàn)基礎(chǔ)的文件下載功能的實(shí)例講解
基礎(chǔ)思路:
之前的思路一直是彈出一個(gè)框問(wèn)用戶想要存放文件的位置,然后我再生成個(gè)文件放到那。然而我這個(gè)想法并沒(méi)有成功。
點(diǎn)擊鏈接來(lái)下載文件的方式很簡(jiǎn)便,后臺(tái)把文件流輸出來(lái),通過(guò)瀏覽器實(shí)現(xiàn)下載功能,包括詢問(wèn)位置與文件存放,大多數(shù)瀏覽器會(huì)配置一個(gè)固定位置,不一定每次都問(wèn)。
前端就非常簡(jiǎn)單了,一個(gè)<a>標(biāo)簽,href=“后臺(tái)方法地址”,如果你的需求不能直接用超鏈接方式,可以在js里寫
window.location.href =“后臺(tái)方法地址"。
這樣跳轉(zhuǎn)到后臺(tái)方法后
String filePath = this.getClass().getClassLoader().getResource("").toURI().getPath() + "/exportPdf.pdf"; //文件在項(xiàng)目中的路徑 File outfile = new File(filePath); String filename = outfile.getName();// 獲取文件名稱 InputStream fis = new BufferedInputStream(new FileInputStream( filePath)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); //讀取文件流 fis.close(); response.reset(); //重置結(jié)果集 response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.replaceAll(" ", "").getBytes("utf-8"), "iso8859-1")); //返回頭 文件名 response.addHeader("Content-Length", "" + outfile.length()); //返回頭 文件大小 response.setContentType("application/octet-stream"); //設(shè)置數(shù)據(jù)種類 //獲取返回體輸出權(quán) OutputStream os = new BufferedOutputStream(response.getOutputStream()); os.write(buffer); // 輸出文件 os.flush(); os.close();
瀏覽器會(huì)直接識(shí)別這種形式的文件輸出,彈出對(duì)話框。
注意此方法一定要用鏈接方式調(diào)后臺(tái),使用ajax和XMLHttpRequest方式都是不行的,這樣返回的文件流會(huì)返回到方法的回調(diào)函數(shù)中,當(dāng)然如果你想在js中獲取文件,這樣也行。
實(shí)例
package cn.itcast.day06.web.servlet; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DownloadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 實(shí)現(xiàn)防盜鏈功能 // 獲得 referer 頭 用于說(shuō)明來(lái)訪者來(lái)自哪里 String referer = request.getHeader("referer"); if(referer==null || !referer.startsWith("http://localhost")) { // 是盜鏈者 response.sendRedirect("/day06/index.jsp"); return ; } // 解決response中文亂碼問(wèn)題 response.setContentType("text/html;charset=utf-8"); // 設(shè)置消息體的編碼 // 通過(guò) http 協(xié)議 發(fā)送的http響應(yīng)消息頭 不能出現(xiàn)中文 中文必須要經(jīng)過(guò)url編碼 String filename = URLEncoder.encode("美女.jpg", "utf-8"); // 通知瀏覽器以下載的方式讀取資源 response.setHeader("content-disposition", "attachment;filename="+filename); // 讀取圖片數(shù)據(jù) 發(fā)給ie瀏覽器 String webPath = "/download/美女.jpg"; // 相當(dāng)于當(dāng)前web應(yīng)用的path ServletContext servletContext = super.getServletContext(); InputStream in = servletContext.getResourceAsStream(webPath); OutputStream out = response.getOutputStream(); int len; byte[] buffer = new byte[1024]; while((len=in.read(buffer))!=-1) out.write(buffer, 0, len); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
- java web項(xiàng)目實(shí)現(xiàn)文件下載實(shí)例代碼
- JavaWeb實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- 用java在web環(huán)境下上傳和下載文件的技巧
- JavaWeb實(shí)現(xiàn)文件上傳與下載的方法
- JavaWeb實(shí)現(xiàn)文件上傳與下載實(shí)例詳解
- JavaWeb動(dòng)態(tài)導(dǎo)出Excel可彈出下載
- JavaWeb中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- Java Web端程序?qū)崿F(xiàn)文件下載的方法分享
- Java Web項(xiàng)目中實(shí)現(xiàn)文件下載功能的實(shí)例教程
- javaweb文件打包批量下載代碼
相關(guān)文章
詳解Java的Hibernate框架中的List映射表與Bag映射
這篇文章主要介紹了Java的Hibernate框架中的List映射表與Bag映射,Hibernate是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下2015-12-12Java中BigDecimal的舍入模式解析(RoundingMode)
這篇文章主要介紹了Java中BigDecimal的舍入模式解析(RoundingMode),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Java postgresql數(shù)組字段類型處理方法詳解
這篇文章主要介紹了Java postgresql數(shù)組字段類型處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10實(shí)例講解Java設(shè)計(jì)模式編程中如何運(yùn)用代理模式
這篇文章主要介紹了Java設(shè)計(jì)模式編程中如何運(yùn)用代理模式,文中舉了普通代理和強(qiáng)制代理的例子作為代理模式的擴(kuò)展內(nèi)容,需要的朋友可以參考下2016-02-02異常點(diǎn)/離群點(diǎn)檢測(cè)算法——LOF解析
這篇文章主要介紹了異常點(diǎn)/離群點(diǎn)檢測(cè)算法——LOF解析,通過(guò)圖解文字描述的方式詳細(xì)的解析了該算法,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Java 服務(wù)端消息推送的實(shí)現(xiàn)小結(jié)
本文主要介紹了Java 服務(wù)端消息推送的實(shí)現(xiàn)小結(jié),主要包括四種常見(jiàn)的消息實(shí)時(shí)推送方案:短輪詢、長(zhǎng)輪詢、SSE?和?WebSocket,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10