最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中實現(xiàn)大文件分片下載和斷點續(xù)傳功能的完整指南

 更新時間:2025年09月08日 09:15:25   作者:IT界Tony哥  
在Spring Boot中實現(xiàn)大文件分片下載和斷點續(xù)傳功能,需結(jié)合HTTP Range協(xié)議和文件流處理技術(shù),本文將展示完整的實現(xiàn)方法,有需要的小伙伴可以參考一下

在Spring Boot中實現(xiàn)大文件分片下載和斷點續(xù)傳功能,需結(jié)合HTTP Range協(xié)議和文件流處理技術(shù)。以下是完整實現(xiàn)方案:

??一、核心原理??

??HTTP Range協(xié)議??

通過Range請求頭指定下載范圍(如Range: bytes=0-999),服務(wù)器返回206 Partial Content狀態(tài)碼及對應(yīng)內(nèi)容片段。

??斷點續(xù)傳機制??

客戶端記錄已下載的字節(jié)范圍,網(wǎng)絡(luò)中斷后通過Range頭續(xù)傳未完成部分。

??二、服務(wù)端實現(xiàn)??

??1. 分片下載接口??

@GetMapping("/download")
public ResponseEntity<InputStreamResource> downloadFile(
    @RequestHeader(value = "Range", required = false) String rangeHeader,
    HttpServletRequest request) throws IOException {
    
    // 獲取文件信息
    File file = new File("/path/to/largefile.zip");
    long fileSize = file.length();
    
    // 解析Range頭
    long start = 0, end = fileSize - 1;
    if (rangeHeader != null) {
        String[] ranges = rangeHeader.replace("bytes=", "").split("-");
        start = Long.parseLong(ranges[0]);
        if (ranges.length > 1) {
            end = Long.parseLong(ranges[1]);
        }
    }
    
    // 校驗范圍合法性
    if (start >= fileSize || end >= fileSize || start > end) {
        return ResponseEntity.status(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE)
                .header("Content-Range", "bytes */" + fileSize)
                .build();
    }
    
    // 設(shè)置響應(yīng)頭
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.setContentLength(end - start + 1);
    headers.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileSize);
    headers.setHeader("Accept-Ranges", "bytes");
    
    // 返回分片數(shù)據(jù)流
    try (InputStream is = new FileInputStream(file);
         InputStreamResource resource = new InputStreamResource(is)) {
        is.skip(start);
        return new ResponseEntity<>(resource, headers, HttpStatus.PARTIAL_CONTENT);
    }
}

??2. 斷點續(xù)傳支持??

??客戶端記錄進(jìn)度??:保存已下載的字節(jié)范圍(如0-999)。

??續(xù)傳請求??:重新發(fā)起請求時攜帶Range: bytes=1000-,服務(wù)器從斷點處繼續(xù)傳輸。

??三、客戶端實現(xiàn)(JavaScript示例)??

// 分片下載邏輯
async function downloadFileWithResume(fileId, fileName) {
  const CHUNK_SIZE = 5 * 1024 * 1024; // 5MB
  let downloadedBytes = 0;
  
  // 獲取文件總大小
  const response = await fetch(`/api/files/${fileId}/size`);
  const totalSize = parseInt(await response.text());
  
  // 檢查本地是否有已下載部分
  const tempFile = await checkLocalProgress(fileName);
  if (tempFile) {
    downloadedBytes = tempFile.size;
  }
  
  // 分片下載
  while (downloadedBytes < totalSize) {
    const end = Math.min(downloadedBytes + CHUNK_SIZE - 1, totalSize - 1);
    const response = await fetch(`/api/files/${fileId}/download`, {
      headers: { Range: `bytes=${downloadedBytes}-${end}` }
    });
    
    if (!response.ok) throw new Error("下載失敗");
    
    const blob = await response.blob();
    await appendToFile(tempFile, blob);
    downloadedBytes += blob.size;
    
    // 更新進(jìn)度
    updateProgress(downloadedBytes / totalSize);
  }
  
  // 完成后重命名文件
  await renameTempFile(tempFile, fileName);
}

// 檢查本地進(jìn)度
async function checkLocalProgress(fileName) {
  const tempPath = `/temp/${fileName}.part`;
  return new Promise(resolve => {
    fs.stat(tempPath, (err, stats) => {
      if (err) resolve(null);
      else resolve(fs.createWriteStream(tempPath, { flags: 'a' }));
    });
  });
}

??四、關(guān)鍵優(yōu)化點??

??內(nèi)存管理??

使用InputStream流式傳輸,避免大文件加載到內(nèi)存。

??并發(fā)控制??

通過線程池限制同時下載的分片數(shù):

@Service
public class DownloadService {
    private final ExecutorService executor = Executors.newFixedThreadPool(10);
    
    public void downloadChunk(String fileId, long start, long end) {
        executor.submit(() -> {
            // 分片下載邏輯
        });
    }
}

??進(jìn)度存儲??

使用Redis記錄每個文件的下載進(jìn)度:

@Autowired
private RedisTemplate<String, String> redisTemplate;

public void saveProgress(String fileId, long downloadedBytes) {
    redisTemplate.opsForValue().set(fileId, String.valueOf(downloadedBytes));
}

??五、測試方案??

??正常下載??

curl -H "Range: bytes=0-999" http://localhost:8080/download

??斷點續(xù)傳??

中斷后重新發(fā)起相同請求,驗證是否從斷點續(xù)傳。

??多線程下載??

使用工具(如Postman)模擬多線程分片請求。

??六、擴展場景??

  • ??視頻流播放??:通過Content-Range實現(xiàn)視頻邊下邊播。
  • ??大文件秒傳??:基于文件MD5校驗,避免重復(fù)傳輸。
  • ??分布式存儲??:結(jié)合MinIO/S3實現(xiàn)分片存儲與合并。

通過上述方案,可高效實現(xiàn)大文件的分片下載和斷點續(xù)傳,支持弱網(wǎng)環(huán)境和超大文件傳輸。完整代碼示例可參考GitHub倉庫(需替換實際存儲路徑)。

到此這篇關(guān)于SpringBoot中實現(xiàn)大文件分片下載和斷點續(xù)傳功能的完整指南的文章就介紹到這了,更多相關(guān)SpringBoot大文件分片下載和斷點續(xù)傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持

相關(guān)文章

  • Java使用Hutool獲取文件名(包括后綴)的方法示例

    Java使用Hutool獲取文件名(包括后綴)的方法示例

    在開發(fā)過程中,我們經(jīng)常需要處理文件名和路徑,Hutool 是一個非常流行的 Java 工具庫,它提供了許多便捷的工具類,可以幫助我們簡化代碼,提高開發(fā)效率,本文將介紹如何使用 Hutool 來獲取文件名(包括后綴),需要的朋友可以參考下
    2025-06-06
  • servlet配置方法及其生命周期詳解

    servlet配置方法及其生命周期詳解

    下面小編就為大家?guī)硪黄猻ervlet配置方法及其生命周期詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • java?工作流引擎設(shè)計實現(xiàn)解析流程定義文件

    java?工作流引擎設(shè)計實現(xiàn)解析流程定義文件

    這篇文章主要為大家介紹了java?工作流引擎設(shè)計與實現(xiàn)及流程定義文件解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Java自學(xué)書籍Top 10

    Java自學(xué)書籍Top 10

    這篇文章主要為大家推薦了Java書籍Top 10,是由Java Inside推薦的十本不錯的Java書籍,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java實現(xiàn)的程序員老黃歷實例

    Java實現(xiàn)的程序員老黃歷實例

    這篇文章主要介紹了Java實現(xiàn)的程序員老黃歷實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • SpringBoot過濾器的使用

    SpringBoot過濾器的使用

    過濾器是對數(shù)據(jù)進(jìn)行過濾,預(yù)處理過程,當(dāng)我們訪問網(wǎng)站時,有時候會發(fā)布一些敏感信息,發(fā)完以后有的會用*替代,還有就是登陸權(quán)限控制等,一個資源,沒有經(jīng)過授權(quán),肯定是不能讓用戶隨便訪問的,這個時候,也可以用到過濾器,需要的朋友可以參考一下
    2021-11-11
  • java的finalize方法解讀

    java的finalize方法解讀

    這篇文章主要介紹了java的finalize方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringBoot定制三種錯誤頁面及錯誤數(shù)據(jù)方法示例

    SpringBoot定制三種錯誤頁面及錯誤數(shù)據(jù)方法示例

    Spring Boot提供的默認(rèn)異常處理機制通常并不一定適合我們實際的業(yè)務(wù)場景,因此,我們通常會根據(jù)自身的需要對Spring Boot全局異常進(jìn)行統(tǒng)一定制,例如定制錯誤頁面,定制錯誤數(shù)據(jù)等。本文主要介紹了SpringBoot三種自定義錯誤頁面的實現(xiàn),快來學(xué)習(xí)吧
    2021-12-12
  • Java入門異常處理最佳實踐

    Java入門異常處理最佳實踐

    本文詳細(xì)介紹了Java異常處理的核心概念、體系結(jié)構(gòu)、處理方式、執(zhí)行流程,并提供了實現(xiàn)自定義異常的方法和開發(fā)中的最佳實踐,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • java枚舉類的屬性、方法和構(gòu)造方法應(yīng)用實戰(zhàn)

    java枚舉類的屬性、方法和構(gòu)造方法應(yīng)用實戰(zhàn)

    這篇文章主要介紹了java枚舉類的屬性、方法和構(gòu)造方法應(yīng)用,結(jié)合實例形式分析了java枚舉類的定義、構(gòu)造及相關(guān)應(yīng)用操作技巧,需要的朋友可以參考下
    2019-08-08

最新評論

阳西县| 亳州市| 防城港市| 哈巴河县| 清流县| 论坛| 望奎县| 咸丰县| 同德县| 阿拉善盟| 天台县| 茌平县| 盐津县| 陇川县| 滦平县| 石棉县| 广平县| 宝兴县| 扎囊县| 海兴县| 蛟河市| 寿宁县| 新龙县| 扶绥县| 广元市| 桓台县| 台北县| 宜兰市| 宾川县| 嘉兴市| 绥棱县| 永靖县| 渑池县| 台中县| 扬中市| 河曲县| 舞钢市| 砚山县| 孙吴县| 宜兴市| 丽水市|