升級 Spring Boot 3 配置講解 —— 支持斷點傳輸的文件上傳和下載功能

學會這款 🔥全新設計的 Java 腳手架 ,從此面試不再怕!

在這里插入圖片描述
在這里插入圖片描述

在現代 Web 應用中,文件上傳和下載是非常常見的需求。然而,當文件較大時,傳統的上傳下載方式可能會遇到網絡不穩定或傳輸中斷的問題。為了解決這些問題,斷點傳輸(Resumable Upload/Download)成為了一個重要的技術手段。Spring Boot 3 提供了更強大的支持,使得實現斷點傳輸變得更加簡單。

本文將詳細介紹如何在 Spring Boot 3 中實現支持斷點傳輸的文件上傳和下載功能,并通過代碼示例幫助你快速上手。


1. 什么是斷點傳輸?

斷點傳輸是指在文件傳輸過程中,如果傳輸中斷(如網絡故障或用戶手動暫停),可以從斷點處繼續傳輸,而不需要重新開始。這種技術對于大文件傳輸尤為重要,因為它可以顯著減少重復傳輸的時間和帶寬消耗。

  • 斷點上傳:客戶端可以將文件分成多個塊(Chunk),分批次上傳,服務器端根據上傳的塊信息進行合并。
  • 斷點下載:客戶端可以請求文件的某一部分,服務器端根據請求的范圍返回對應的文件內容。

2. 環境準備

在開始之前,確保你已經具備以下環境:

  • JDK 17 或更高版本(Spring Boot 3 要求的最低 JDK 版本)
  • Maven 或 Gradle 構建工具
  • Spring Boot 3.x

pom.xml 中添加以下依賴:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
</dependencies>

3. 實現斷點上傳

3.1 配置文件上傳限制

application.properties 中配置文件上傳的限制:

# 設置單個文件的最大大小
spring.servlet.multipart.max-file-size=1GB# 設置總上傳文件的最大大小
spring.servlet.multipart.max-request-size=1GB

3.2 實現斷點上傳接口

為了實現斷點上傳,我們需要記錄每個文件的上傳進度。以下是一個簡單的實現:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;@Controller
public class ResumableUploadController {// 保存文件塊的臨時目錄private static final String UPLOAD_DIR = "uploads/";// 用于記錄文件上傳進度的緩存private final Map<String, Long> uploadProgressMap = new HashMap<>();@PostMapping("/upload")@ResponseBodypublic String handleChunkUpload(@RequestParam("file") MultipartFile file,@RequestParam("chunkNumber") int chunkNumber,@RequestParam("totalChunks") int totalChunks,@RequestParam("identifier") String identifier) throws IOException {// 獲取文件塊的大小long chunkSize = file.getSize();String fileName = file.getOriginalFilename();// 創建臨時文件目錄File uploadDir = new File(UPLOAD_DIR);if (!uploadDir.exists()) {uploadDir.mkdirs();}// 將文件塊寫入臨時文件String tempFileName = UPLOAD_DIR + identifier + "_" + fileName;try (RandomAccessFile randomAccessFile = new RandomAccessFile(tempFileName, "rw")) {randomAccessFile.seek((chunkNumber - 1) * chunkSize);randomAccessFile.write(file.getBytes());}// 更新上傳進度uploadProgressMap.put(identifier, (long) chunkNumber);// 如果所有塊都已上傳,合并文件if (chunkNumber == totalChunks) {mergeFileChunks(tempFileName, fileName);uploadProgressMap.remove(identifier);return "Upload complete!";}return "Chunk " + chunkNumber + " uploaded!";}private void mergeFileChunks(String tempFileName, String fileName) throws IOException {File mergedFile = new File(UPLOAD_DIR + fileName);try (RandomAccessFile randomAccessFile = new RandomAccessFile(mergedFile, "rw")) {for (int i = 1; i <= uploadProgressMap.size(); i++) {File chunkFile = new File(tempFileName + "_" + i);byte[] chunkData = Files.readAllBytes(chunkFile.toPath());randomAccessFile.write(chunkData);chunkFile.delete(); // 刪除臨時文件塊}}}
}

3.3 前端實現斷點上傳

在前端,可以使用 JavaScript 將文件分塊并發送到服務器。以下是一個簡單的示例:

<input type="file" id="fileInput" />
<button onclick="uploadFile()">上傳</button><script>async function uploadFile() {const file = document.getElementById('fileInput').files[0];const chunkSize = 1024 * 1024; // 1MBconst totalChunks = Math.ceil(file.size / chunkSize);const identifier = UUID.randomUUID();for (let i = 1; i <= totalChunks; i++) {const chunk = file.slice((i - 1) * chunkSize, i * chunkSize);const formData = new FormData();formData.append('file', chunk);formData.append('chunkNumber', i);formData.append('totalChunks', totalChunks);formData.append('identifier', identifier);await fetch('/upload', {method: 'POST',body: formData});}alert('文件上傳完成!');}
</script>

4. 實現斷點下載

4.1 實現斷點下載接口

Spring Boot 3 支持通過 Range 請求頭實現斷點下載。以下是一個簡單的實現:

import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRange;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;@RestController
public class ResumableDownloadController {private static final String DOWNLOAD_DIR = "uploads/";@GetMapping("/download/{filename:.+}")public ResponseEntity<Resource> downloadFile(@PathVariable String filename,@RequestHeader(value = "Range", required = false) String rangeHeader) throws IOException {Path path = Paths.get(DOWNLOAD_DIR + filename);Resource resource = new UrlResource(path.toUri());if (!resource.exists() || !resource.isReadable()) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);}long fileLength = resource.contentLength();if (rangeHeader == null) {// 如果沒有 Range 請求頭,返回整個文件return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"").header(HttpHeaders.CONTENT_LENGTH, String.valueOf(fileLength)).body(resource);} else {// 解析 Range 請求頭List<HttpRange> ranges = HttpRange.parseRanges(rangeHeader);HttpRange range = ranges.get(0);long start = range.getRangeStart(fileLength);long end = range.getRangeEnd(fileLength);// 返回部分文件內容long rangeLength = end - start + 1;return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT).header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"").header(HttpHeaders.CONTENT_RANGE, "bytes " + start + "-" + end + "/" + fileLength).header(HttpHeaders.CONTENT_LENGTH, String.valueOf(rangeLength)).body(resource);}}
}

4.2 測試斷點下載

使用支持斷點下載的工具(如 curl 或瀏覽器)測試下載功能。例如:

curl -H "Range: bytes=0-1023" http://localhost:8080/download/example.txt -o example.txt

5. 總結

通過本文的介紹,你已經學會了如何在 Spring Boot 3 中實現支持斷點傳輸的文件上傳和下載功能。斷點傳輸技術可以顯著提升大文件傳輸的效率和可靠性,是現代 Web 應用中不可或缺的一部分。

希望本文的內容能夠幫助你在實際項目中更好地處理文件上傳和下載的需求。如果你有任何問題或建議,歡迎在評論區留言討論。Happy coding!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65126.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65126.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65126.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

框架Tensorflow2

深度學習框架之Tensorflow2 Tensorflow2版本的介紹 Tensorflow(簡稱tf)是深度學習框架&#xff0c;大大簡化了建模的方法和步驟&#xff0c;把Keras Api當作核心&#xff0c;使用非常簡單&#xff0c;跨平臺&#xff0c;集成各種現成模型&#xff0c;eager mode使得調試起來不…

SpringBoot3-深入理解自動配置類的原理(尚硅谷SpringBoot3-雷神)

文章目錄 目錄了解自動配置 一、導入對應場景的Mean依賴&#xff1a;1、引入依賴**找到自動配置類的所有配置都存放在哪里** 二、編寫主程序&#xff1a;SpringBootApplication觀察源碼時所需要知道的幾個核心注解&#xff1a;1、觀察SpringBootApplication源碼都做了什么 三、…

Mongo高可用架構解決方案

Mongo主從復制哪些事(僅適用特定場景) 對數據強一致性要求不高的場景,一般微服務架構中不推薦 master節點可讀可寫操作,當數據有修改時,會將Oplog(操作日志)同步到所有的slave節點上。那么對于從節點來說僅只讀,所有slave節點從master節點同步數據,然而從節點之間互相…

商業領域 - 競標極簡理解

競標極簡理解 競標是一種投標過程&#xff0c;指參與者&#xff08;通常是企業或個人&#xff09;為了獲得某個項目或合同的執行權&#xff0c;向招標人&#xff08;通常是采購方或項目發起方&#xff09;提交報價和方案&#xff0c;并爭取獲得招標人的認可 競標是一種常見的招…

C#Halcon跨窗口顏色識別

機器視覺是一門讓計算機模擬人類視覺功能的學科。顏色識別在其中扮演著重要的角色&#xff0c;它旨在通過對圖像中的顏色信息進行分析&#xff0c;從而識別出圖像中的目標物體或者區域。例如&#xff0c;在水果分揀系統中&#xff0c;可以根據水果的顏色&#xff08;如蘋果的紅…

01:C語言的本質

C語言的本質 1、ARM架構與匯編2、局部變量初始化與空間分配2.1、局部變量的初始化2.1、局部變量數組初始化 3、全局變量/靜態變量初始化化與空間分配4、堆空間 1、ARM架構與匯編 ARM簡要架構如下&#xff1a;CPU&#xff0c;ARM(能讀能寫)&#xff0c;Flash&#xff08;能讀&a…

Transformer知識梳理

Transformer知識梳理 文章目錄 Transformer知識梳理什么是Transformer&#xff1f;語言模型遷移學習 Transformer結構注意力層原始結構 總結 什么是Transformer&#xff1f; 語言模型 Transformer模型本質上都是預訓練語言模型&#xff0c;大部分采用自監督學習&#xff08;S…

第29天:PHP應用弱類型脆弱Hash加密Bool類型Array數組函數轉換比較

#知識點&#xff1a; 1、安全開發-原生PHP-弱類型脆弱 2、安全開發-原生PHP-函數&數據類型 3、安全開發-原生PHP-代碼審計案例 1、 和 兩個等號是弱比較&#xff0c;使用進行對比的時候&#xff0c;php解析器就會做隱式類型轉換&#xff0c;如果兩個值的類型不相等就會把兩…

STM32F1學習——編碼器接口

一、編碼器接口 編碼器接口可以接收正交編碼器的信號&#xff0c;根據編碼器旋轉產生的正交信號脈沖&#xff0c;通過硬件自動控制CNT值的自增或自減&#xff0c;從而指出編碼器的位置、旋轉方向和旋轉速度。 每個高級定時器和通用定時器都有一個編碼器接口&#xff0c;他們會占…

如何刪除 Docker 中的懸虛鏡像?

在 Docker 中&#xff0c;懸虛鏡像&#xff08;Dangling Images&#xff09;是指那些沒有 標簽 且沒有被任何容器使用的鏡像。這些鏡像通常是由于構建過程中生成的中間層鏡像或未正確清理的鏡像殘留。刪除懸虛鏡像可以釋放磁盤空間并保持 Docker 環境的整潔。 1. 列出懸虛鏡像…

網絡安全的學習與實踐經驗(附資料合集)

學習資源 在線學習平臺&#xff1a; Hack This Site&#xff1a;提供從初學者到高級難度的挑戰任務&#xff0c;適合練習各種網絡安全技術。XCTF_OJ&#xff1a;由XCTF組委會開發的免費在線網絡安全網站&#xff0c;提供豐富的培訓材料和資源。SecurityTube&#xff1a;提供豐…

ts是什么、tsc是什么、tsx是什么、jsx是什么、scss是什么

一、TS (TypeScript): TypeScript 是一種由微軟開發的開源編程語言&#xff0c;它是 JavaScript 的一個超集&#xff0c;增加了類型系統和對ES6及以后版本新特性的支持。TypeScript 旨在解決 JavaScript 開發中的可維護性、可擴展性和大型項目中的復雜性問題。它允許開發者在編…

行業商機信息付費小程序系統開發方案

行業商機信息付費小程序系統&#xff0c;主要是整合優質行業資源&#xff0c;實時更新的商機信息。在當今信息爆炸的時代&#xff0c;精準、高效地獲取行業商機信息對于企業和個人創業者而言至關重要。 一、使用場景 日常瀏覽&#xff1a;用戶在工作間隙或閑暇時間&#xff0c…

[Qt] 輸入控件 | Line | Text | Combo | Spin | Date | Dial | Slider

目錄 輸入類控件 1、Line Edit 錄入個人信息 使用正則表達式驗證輸入框的數據 驗證兩次輸入的密碼一致 切換顯示密碼 2、Text Edit 獲取多行輸入框的內容 驗證輸入框的各種信號 3、Combo Box 使用下拉框模擬麥當勞點餐 從文件中加載下拉框的選項 4、Spin Box 調整…

Flink CDC 自定義函數處理 SQLServer XML類型數據 映射 doris json字段方案

Flink CDC 自定義函數處理 SQLServer XML類型數據方案 1. 背景 因業務使用SQLServer數據庫&#xff0c;CDC同步到doris 數倉。對于SQLServer xml類型&#xff0c;doris沒有相應的字段對應&#xff0c; 可以使用json來存儲xml數據。需要進行一步轉換。從 flink 自定義函數入手…

C語言:cJSON將struct結構體與JSON互相轉換

文章目錄 struct 轉 jsonjson 轉 struct 文檔&#xff1a; https://github.com/DaveGamble/cJSON 項目結構 . ├── libs │ ├── cJSON.c │ └── cJSON.h └── main.c示例 struct 轉 json #include "libs/cJSON.h" #include <stdio.h>// defi…

JeeSite 快速開發平臺:全能企業級快速開發解決方案|GitCode 光引計劃征文展示

投稿人GitCode ID&#xff1a;thinkgem 光引計劃投稿項目介紹 JeeSite 快速開發平臺&#xff0c;不僅僅是一個后臺開發框架&#xff0c;它是一個企業級快速開發解決方案&#xff0c;后端基于經典組合 Spring Boot、Shiro、MyBatis&#xff0c;前端采用 Beetl、Bootstrap、Admi…

2025/1/4期末復習 密碼學 按老師指點大綱復習

我們都要堅信&#xff0c;道路越是曲折&#xff0c;前途越是光明。 --------------------------------------------------------------------------------------------------------------------------------- 現代密碼學 第五版 楊波 第一章 引言 1.1三大主動攻擊 1.中斷…

【架構設計(一)】常見的Java架構模式

常見的 Java 架構模式解析 在 Java 開發領域&#xff0c;選擇合適的架構模式對于構建高效、可維護且能滿足業務需求的軟件系統至關重要。本文將深入探討幾種常見的 Java架構模式&#xff0c;包括單體架構與微服務架構、分層架構與微服務架構的對比&#xff0c;以及事件驅動架構…

opencv與halcon的差距及改進方法

本文是直接問ai獲得的結果。 在我理解中&#xff0c;這是開源軟件與商業非開源工業軟件的普遍差距特點。 商業非開源工業軟件的人員、資金、時間投入是巨大的&#xff0c;開發人員也不是普通人普通水平。 一般情況下&#xff0c;試圖通過開源軟件改吧改吧就實現彎道超車&#x…