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里寫(xiě)
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中實(shí)現(xiàn)定時(shí)任務(wù)的兩種方法舉例詳解
這篇文章主要給大家介紹了關(guān)于Java中實(shí)現(xiàn)定時(shí)任務(wù)的兩種方法,文中總結(jié)了各種實(shí)現(xiàn)方式的優(yōu)缺點(diǎn),并給出了推薦的使用場(chǎng)景,通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
詳解SpringBoot中添加@ResponseBody注解會(huì)發(fā)生什么
這篇文章主要介紹了詳解SpringBoot中添加@ResponseBody注解會(huì)發(fā)生什么,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
SpringBoot中的@ConfigurationProperties注解解析
這篇文章主要介紹了SpringBoot中的@ConfigurationProperties注解解析,Spring源碼中大量使用了ConfigurationProperties注解,通過(guò)與其他注解配合使用,能夠?qū)崿F(xiàn)Bean的按需配置,該注解可以放在類上,也可以放在方法上,需要的朋友可以參考下2023-11-11
SpringBoot啟動(dòng)流程入口參數(shù)創(chuàng)建對(duì)象源碼分析
這篇文章主要為大家介紹了SpringBoot啟動(dòng)流程入口參數(shù)研究及創(chuàng)建對(duì)象源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Java MongoDB數(shù)據(jù)庫(kù)連接方法梳理
MongoDB作為一種介于關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)之間的產(chǎn)品,它可以提供可擴(kuò)展的高性能的數(shù)據(jù)存儲(chǔ)解決方案,近些年來(lái)受到了開(kāi)發(fā)者的喜愛(ài)2022-08-08
Java無(wú)限級(jí)樹(shù)(遞歸)超實(shí)用案例
下面小編就為大家?guī)?lái)一篇Java無(wú)限級(jí)樹(shù)(遞歸)超實(shí)用案例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11

