使用Servlet實現檔案下載

一只爱阅读的程序员發表於2024-03-17

  一位朋友最近在學習JavaWeb開發,開始學習檔案下載操作,他自己嘗試著去網上看一些教程,總的來說也不是太瞭解,就讓我和他說說,如何實現檔案下載功能。我和他說了一下大致的思路,主要分為前端和後端兩部分來實現檔案下載操作。

後臺Java程式碼實現思路:

.1.讀取檔案資訊;

.2.設定返回資料的響應型別為(二進位制)流型別;

常見的型別有application/json返回JSON格式的資料;text/html返回html文件資料;application/octet-stream表示返回二進位制流資料,檔案下載就使用該種方式。

.3.設定響應頭資訊;注意:檔名有中文需要單獨編碼;Content-Disposition表示客戶端以何種方式來處理返回後臺返回的資料,值為"attachment"表示作為附件下載;

.4.獲取檔案輸入流和響應物件輸出流 使用try()的語法不用手動關閉輸入輸出流;

.5.將輸入流寫入到響應輸出流中;

.6.重新整理緩衝區資料;

前端html實現思路:

.1.方式一:使用window.location.href=請求地址;

.2.方式二:使用 window.open(請求地址);

.3.方式三:動態建立一個a標籤,然後設定a標籤的href屬性為請求地址,手動觸發單擊click()事件;

.4.方式四:直接寫一個a標籤,href屬性設定為請求地址,點選即可。

前端頁面實現起來比較簡單,主要是傳送一個請求到後臺即可。

後端示例程式碼實現如下:

@WebServlet("/fileDownLoad")
public class FileDownLoadTest extends HttpServlet {
@Override
public void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
// 1.讀取檔案資訊
File file = new File("D:\\JavaWorkSpace\\course2024\\maven-demo\\src\\main\\webapp\\bg.png");
String fileName = file.getName();
// 2.設定返回資料的響應型別為(二進位制)流型別
response.setContentType("application/octet-stream");
// 3.設定響應頭資訊 告訴瀏覽器以何種方式處理後臺返回的資料;attachment 表示瀏覽器以下載的形式開啟檔案
// 檔名有中文需要單獨編碼
String encodedFilename = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "inline;filename=" + encodedFilename);
// 4.獲取檔案輸入流和響應物件輸出流 使用try()的語法不用手動關閉輸入輸出流
// 使用新增了 Bufferd 的檔案處理類 效率會更高一些
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); ){
// 5.將輸入流寫入到響應輸出流中
int len;
byte[] bytes = new byte[1024];
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
// 6.重新整理緩衝區資料
bos.flush();
} catch (Exception e){
e.printStackTrace();
}

System.out.println("檔案下載完成!");
}
}

前端示例程式碼如下:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Title</title>

</head>

<body>

<button onclick="downloadTest()">location-方式下載</button><br>

<button onclick="downloadTest2()">open-籤方式下載</button><br>

<button onclick="downloadTest3()">a-籤方式下載</button><br>

<a href="http://localhost:8080/maven-demo/fileDownLoad">a籤方點選下載</a><br>

</body>

</html>

<script>

function downloadTest() {

window.location.href = "http://localhost:8080/maven-demo/fileDownLoad";

}

function downloadTest2() {

window.open("http://localhost:8080/maven-demo/fileDownLoad");

}

function downloadTest3() {

var a = document.createElement("a");

a.href = "http://localhost:8080/maven-demo/fileDownLoad";

a.click();

}

</script>

最終測試效果如下,

測試方式一:可以直接在瀏覽器中放入請求地址,然後點選Enter鍵即可。

測試方式二:使用除錯工具,比如apiFox;傳送請求後,會將檔案暫存在工具中,需要手動下載。

測試三:開啟下載頁面,點選任意一個下載連結,即可完成檔案的下載。

至此:檔案下載的功能全部完成。說明:Java程式碼中,在進行I/O流操作時,能使用帶buffer緩衝區的類儘量使用,因為它的效率會高很多。效能相關可參考部落格:

https://blog.csdn.net/qq_32099833/article/details/109002715

相關文章