精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot大文件上傳卡死?分塊切割術搞定GB級傳輸,速度飆升!!!

開發 前端
分塊上傳就像把大文件運輸變成一場接力賽,每個分片都是一個選手,各司其職,共同完成任務。通過分塊切割、斷點續傳、并行加速和安全防護,我們不僅解決了大文件上傳的卡死問題,還提升了用戶體驗和系統性能。現在,你可以自信地對用戶說:不管多大的文件,我們都能輕松搞定!

兄弟們,當你正在開發一個視頻網站,用戶要上傳一個 5GB 的 4K 視頻。傳統的 SpringBoot 單文件上傳就像開著一輛裝滿貨物的三輪車爬坡 ——內存爆炸、超時崩潰、網絡波動分分鐘讓你前功盡棄。這時候,分塊切割術就像給三輪車裝上渦輪增壓,把大文件切成小塊分批運輸,讓上傳過程變得像高鐵一樣平穩高效。

一、傳統上傳的「死亡陷阱」

1. 內存黑洞

SpringBoot 默認用MultipartFile接收文件,大文件會直接加載到內存。5GB 的文件相當于把一頭大象塞進小轎車,內存直接溢出,服務器瞬間卡死。

2. 超時魔咒

HTTP 請求有默認超時時間(Tomcat 默認 60 秒),上傳一個 5GB 文件需要至少 10 分鐘,超時是必然的。用戶只能眼睜睜看著進度條卡在 99%,然后重新再來。

3. 網絡過山車

上傳到一半突然斷網,傳統方案只能從頭再來。用戶可能已經等了半小時,結果竹籃打水一場空,這種體驗簡直讓人想砸電腦。

二、分塊切割術的「九陽神功」

1. 分而治之的智慧

把大文件切成 20MB 的小塊,就像把大象拆成零件運輸。每個小塊獨立上傳,失敗了只需要重傳那一塊,大大降低風險。

2. 斷點續傳的魔法

記錄已經上傳的分片,網絡恢復后從斷點繼續。用戶可以暫停、重啟上傳,甚至關閉電腦第二天接著傳,就像下載電影一樣方便。

3. 并行加速的奧義

同時上傳多個分片,充分利用帶寬。就像多條車道同時通車,上傳速度直接翻倍。

三、后端實現:打造「文件運輸線」

1. 數據庫設計:記錄運輸狀態

CREATE TABLE file_upload (
    id VARCHAR(36) PRIMARY KEY, -- 文件唯一標識
    total_size BIGINT NOT NULL, -- 文件總大小
    total_chunks INT NOT NULL, -- 總分片數
    uploaded_chunks INT DEFAULT 0, -- 已上傳分片數
    status INT DEFAULT 0 -- 0-進行中,1-完成,2-失敗
);

2. 分片上傳接口:接收零件

@PostMapping("/upload/chunk")
public ResponseEntity<?> uploadChunk(
    @RequestParam("file") MultipartFile chunk,
    @RequestParam("fileId") String fileId,
    @RequestParam("chunkIndex") int chunkIndex) {
    
    // 檢查分片是否已存在
    if (chunkRepository.existsByFileIdAndChunkIndex(fileId, chunkIndex)) {
        return ResponseEntity.ok("分片已存在");
    }
    
    // 保存分片到臨時目錄
    String chunkPath = Paths.get(uploadDir, fileId, chunkIndex + ".part").toString();
    chunk.transferTo(Paths.get(chunkPath));
    
    // 更新數據庫狀態
    chunkRepository.save(new Chunk(fileId, chunkIndex, chunk.getSize()));
    
    return ResponseEntity.ok("分片上傳成功");
}

3. 合并接口:組裝零件

@PostMapping("/upload/merge")
public ResponseEntity<?> mergeChunks(@RequestParam("fileId") String fileId) {
    // 查詢所有分片
    List<Chunk> chunks = chunkRepository.findByFileId(fileId);
    
    // 按順序合并
    try (RandomAccessFile target = new RandomAccessFile(Paths.get(uploadDir, fileId).toFile(), "rw")) {
        for (Chunk chunk : chunks) {
            try (FileInputStream in = new FileInputStream(Paths.get(uploadDir, fileId, chunk.getChunkIndex() + ".part").toFile())) {
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = in.read(buffer)) != -1) {
                    target.write(buffer, 0, bytesRead);
                }
            }
        }
    }
    
    // 刪除臨時分片
    chunks.forEach(chunk -> {
        try {
            Files.delete(Paths.get(uploadDir, fileId, chunk.getChunkIndex() + ".part"));
        } catch (IOException e) {
            log.error("刪除分片失敗", e);
        }
    });
    
    // 更新文件狀態
    fileUploadRepository.updateStatus(fileId, 1);
    
    return ResponseEntity.ok("文件合并成功");
}

四、前端實現:「零件加工廠」

1. 分片切割:拆大象

function splitFile(file, chunkSize = 20 * 1024 * 1024) {
    const chunks = [];
    let current = 0;
    while (current < file.size) {
        const chunk = file.slice(current, current + chunkSize);
        chunks.push(chunk);
        current += chunkSize;
    }
    return chunks;
}

2. 并行上傳:多條車道

async function uploadChunks(chunks, fileId) {
    const promises = chunks.map((chunk, index) => {
        const formData = new FormData();
        formData.append("file", chunk);
        formData.append("fileId", fileId);
        formData.append("chunkIndex", index);
        
        return fetch("/upload/chunk", {
            method: "POST",
            body: formData
        });
    });
    
    await Promise.all(promises);
}

3. 進度條:實時反饋

<div class="progress">
    <div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<script>
function updateProgress(uploaded, total) {
    const progressBar = document.querySelector('.progress-bar');
    progressBar.style.width = `${(uploaded / total) * 100}%`;
    progressBar.setAttribute('aria-valuenow', `${(uploaded / total) * 100}`);
}
</script>

五、斷點續傳:「失敗重來」的勇氣

1. 記錄上傳狀態

localStorage.setItem('uploadStatus', JSON.stringify({
    fileId: '123',
    uploadedChunks: [0, 1, 3]
}));

2. 恢復上傳

async function resumeUpload(file) {
    const status = JSON.parse(localStorage.getItem('uploadStatus'));
    const chunks = splitFile(file);
    
    // 找出未上傳的分片
    const remainingChunks = chunks.filter((_, index) => !status.uploadedChunks.includes(index));
    
    await uploadChunks(remainingChunks, status.fileId);
}

六、性能優化:「速度與激情」

1. 異步處理:解放線程

@Async("fileUploadExecutor")
public CompletableFuture<?> asyncMerge(String fileId) {
    return CompletableFuture.runAsync(() -> {
        // 合并文件邏輯
    });
}

2. 動態分塊:適應路況

function calculateChunkSize(bandwidth) {
    // 根據網絡帶寬動態調整分片大小
    return Math.max(10 * 1024 * 1024, Math.min(50 * 1024 * 1024, bandwidth * 0.8));
}

3. 多線程合并:同時組裝

ExecutorService executor = Executors.newFixedThreadPool(4);
List<Future<?>> futures = new ArrayList<>();

for (int i = 0; i < chunks.size(); i += 4) {
    final int start = i;
    futures.add(executor.submit(() -> {
        for (int j = start; j < Math.min(start + 4, chunks.size()); j++) {
            // 合并分片
        }
    }));
}

futures.forEach(future -> {
    try {
        future.get();
    } catch (Exception e) {
        log.error("合并失敗", e);
    }
});

七、安全防護:「文件運輸的保險」

1. MD5 校驗:防篡改

@PostMapping("/upload/check")
public ResponseEntity<?> checkFile(@RequestParam("file") MultipartFile file) {
    String md5 = calculateMD5(file.getInputStream());
    FileUpload fileUpload = fileUploadRepository.findByMd5(md5);
    
    if (fileUpload != null && fileUpload.getStatus() == 1) {
        return ResponseEntity.ok("文件已存在");
    }
    
    return ResponseEntity.ok("文件不存在");
}

2. 文件類型驗證:防病毒

@PostMapping("/upload/chunk")
public ResponseEntity<?> uploadChunk(@RequestParam("file") MultipartFile chunk) {
    String contentType = chunk.getContentType();
    if (!contentType.startsWith("image/") && !contentType.startsWith("video/")) {
        return ResponseEntity.badRequest().body("不支持的文件類型");
    }
    
    // 其他邏輯
}

3. 權限控制:防越權

@PreAuthorize("hasRole('ROLE_ADMIN')")
@PostMapping("/upload/merge")
public ResponseEntity<?> mergeChunks(@RequestParam("fileId") String fileId) {
    // 合并邏輯
}

八、實戰案例:「5GB 視頻上傳的逆襲」

1. 傳統方案

  • 上傳時間:15 分鐘
  • 內存占用:800MB
  • 失敗率:30%(網絡波動)

2. 分塊方案

  • 上傳時間:4 分鐘(并行上傳)
  • 內存占用:50MB(流式處理)
  • 失敗率:2%(斷點續傳)

九、總結:「分塊切割術」的終極奧義

分塊上傳就像把大文件運輸變成一場接力賽,每個分片都是一個選手,各司其職,共同完成任務。通過分塊切割、斷點續傳、并行加速和安全防護,我們不僅解決了大文件上傳的卡死問題,還提升了用戶體驗和系統性能。現在,你可以自信地對用戶說:不管多大的文件,我們都能輕松搞定!

責任編輯:武曉燕 來源: 石杉的架構筆記
相關推薦

2025-06-27 02:32:00

2025-04-10 08:03:31

Spring系統

2020-08-14 11:01:32

數據Pandas文件

2025-07-03 07:41:34

2024-09-26 09:28:06

內存Spring

2021-11-26 22:01:26

Linux傳輸網絡

2021-06-07 00:03:31

HTTP大文件方案

2009-11-16 11:41:19

PHP上傳大文件

2022-06-13 14:06:33

大文件上傳前端

2025-05-06 01:21:00

C#內存SIMD

2022-08-16 16:00:05

Python

2009-07-21 15:38:31

2010-09-07 16:11:55

CSS Sprites

2021-01-15 11:40:44

文件Java秒傳

2022-08-12 22:53:32

HadoopHDFS分布式

2021-06-10 09:05:43

Linux命令大文件切割

2014-03-10 17:17:53

西數My Passport試用

2011-12-14 09:57:17

最快網絡傳輸速度186GB

2013-05-29 09:59:20

Java-RMI遠程調用

2024-07-02 10:18:18

點贊
收藏

51CTO技術棧公眾號

4438五月综合| 91在线网址| 亚洲欧美日韩精品一区二区| 亚洲精品永久免费精品| 亚洲高清在线免费观看| jizzjizz亚洲| 久久精品视频在线免费观看| 国产在线久久久| 国产香蕉视频在线| 欧美丰满老妇| 日韩电影大片中文字幕| 中文字幕精品一区二区三区在线| 色呦呦在线免费观看| 久久影院视频免费| 91在线观看网站| 国产精品尤物视频| 怡红院精品视频在线观看极品| 亚洲视频专区在线| 日本天堂在线播放| **欧美日韩在线| 色国产精品一区在线观看| 在线观看av的网址| 国产51人人成人人人人爽色哟哟| 国产剧情av麻豆香蕉精品| 日韩av电影免费观看高清| 五月婷婷一区二区| 日韩精品2区| 亚洲毛片在线免费观看| 佐佐木明希电影| 欧美日韩va| 在线观看视频91| 国产免费黄视频| 青草在线视频在线观看| 国产精品二三区| 特级西西444www大精品视频| 天天操天天干天天爽| 韩国理伦片一区二区三区在线播放 | 色综合久久久| 91国产精品成人| 免费黄色日本网站| 爱草tv视频在线观看992| 亚洲激情在线播放| 成年人黄色在线观看| 成人高潮成人免费观看| 久久五月婷婷丁香社区| 久久久99国产精品免费| 天天舔天天干天天操| 成人做爰69片免费看网站| 97视频中文字幕| www.99视频| 国产精品综合久久| 96国产粉嫩美女| av高清一区二区| 经典三级在线一区| 91精品视频在线| 国产精品人妻一区二区三区| 久88久久88久久久| 成人精品网站在线观看| 国产露脸国语对白在线| 黄色精品一二区| 成人av在线亚洲| 国产99视频在线| 懂色av噜噜一区二区三区av| 国产精品免费视频一区二区| 日本韩国免费观看| 91在线视频播放地址| 欧美福利精品| wwwww在线观看免费视频| 亚洲国产精品成人综合| 一区二区视频在线观看| 国产精品刘玥久久一区| 夜夜操天天操亚洲| 97视频在线免费| 在线视频cao| 欧美三级日韩在线| 亚洲国产欧美91| 盗摄系列偷拍视频精品tp| 亚洲国产又黄又爽女人高潮的| 一区二区三区少妇| 欧美美女视频| 欧美成人精品在线观看| 日本少妇激情舌吻| 日韩av在线发布| 91免费人成网站在线观看18| 亚洲卡一卡二卡三| 久久婷婷一区二区三区| 亚洲欧洲日本国产| 日本高清成人vr专区| 精品欧美一区二区三区| 欧美 日韩 激情| 青青草国产一区二区三区| 欧美成人国产一区二区| 黄色正能量网站| 久久成人综合| 亚洲91av视频| 无码人妻丰满熟妇区bbbbxxxx | 亚洲午夜在线观看视频在线| 免费高清在线观看免费| 成人福利片在线| 亚洲第一网中文字幕| 少妇精品无码一区二区免费视频| 伊人青青综合网| 欧美一区二区三区免费观看| 亚洲资源在线播放| 91尤物视频在线观看| 宅男av一区二区三区| 日韩伦理在线| 欧美一级片免费看| 久久久久久久毛片| 伊人久久综合| 亚洲尤物视频网| 毛片在线播放网站| 一区二区三区四区精品在线视频| 九色在线视频观看| 精品精品视频| 正在播放欧美视频| 毛片毛片女人毛片毛片| 国产精品一卡二卡| 亚洲欧美久久234| 伊人久久综合一区二区| 精品国产一区二区三区av性色| 久久日免费视频| 国产精品入口| 国产精品区一区二区三含羞草| 91在线高清| 色婷婷亚洲综合| 催眠调教后宫乱淫校园| 97精品视频在线看| 国产精品久久久久久av下载红粉 | 欧美一级淫片aaaaaaa视频| 国产chinasex对白videos麻豆| 久久久久久麻豆| 国产在线精品91| 国产一区福利| 高清欧美性猛交xxxx| 午夜免费福利视频| 亚洲精品久久久久久国产精华液 | 97se亚洲国产综合自在线 | av电影在线免费| 日韩一级欧美一级| 爱爱视频免费在线观看| 精久久久久久久久久久| 亚洲无玛一区| 日韩一级特黄| 久久精品国产久精国产思思| 中文字幕久久久久| 亚洲国产精品99久久久久久久久 | 国产精品传媒麻豆hd| 一区二区成人精品| 免费又黄又爽又猛大片午夜| 久久久久久久网| 嫩草av久久伊人妇女超级a| 九九综合九九| 国产精品久久久久久久久久久不卡| 狠狠v欧美ⅴ日韩v亚洲v大胸| 色综合色综合色综合| 亚洲成人网在线播放| 久久国产直播| 视频一区二区三区免费观看| 成人亚洲免费| 久久久国产一区二区| 国产chinasex对白videos麻豆| 亚洲精品国产成人久久av盗摄| 宇都宫紫苑在线播放| 韩日成人av| 久热这里只精品99re8久 | 18av在线播放| 亚洲国产精久久久久久| 欧美在线观看不卡| 中文字幕第一页久久| 成人av毛片在线观看| 欧美在线免费一级片| 国产精品一区二区在线观看| 久草在线资源福利站| 国产性猛交xxxx免费看久久| 91久久精品无码一区二区| 亚洲精品中文字幕在线观看| 亚洲图片综合网| 日韩电影免费在线| 亚洲天堂第一区| 欧美成人基地| 国产精品一区二区久久国产| 182tv在线播放| 亚洲美女自拍视频| 97人妻精品一区二区三区软件| 亚洲精品菠萝久久久久久久| 国产精品三级在线观看无码| 久久精品国产一区二区| 欧美这里只有精品| 精品国产乱码久久久久久果冻传媒 | 乱子伦视频在线看| 婷婷亚洲图片| 久久精彩视频| www.久久久.com| 欧美亚洲成人精品| 成人在线直播| 日韩大陆毛片av| 国产精品玖玖玖| 欧美日韩精品二区| 玖玖爱这里只有精品| 久久久噜噜噜久久人人看| 巨乳女教师的诱惑| 男人的j进女人的j一区| 分分操这里只有精品| 97精品国产| 品久久久久久久久久96高清| 99精品在免费线中文字幕网站一区 | 开心激情综合| 亚洲伊人成综合成人网| 成人视屏在线观看| 国模私拍一区二区三区| 免费**毛片在线| 亚洲性夜色噜噜噜7777| 色婷婷av一区二区三| 911精品国产一区二区在线| 国产又大又黄又粗| 性感美女久久精品| 欧美丰满熟妇bbbbbb| 欧美激情一区不卡| 一级做a爰片毛片| 国产不卡视频一区| 三年中文在线观看免费大全中国| 久久一区二区三区超碰国产精品| 中文字幕精品在线播放| 日韩成人激情| 婷婷精品国产一区二区三区日韩| 美女av一区| 国产九区一区在线| 一区二区在线视频观看| 亚洲r级在线观看| 青娱乐极品盛宴一区二区| 国产成人精品综合| 成人动漫一区| 青青草成人在线| av在线播放资源| 欧美激情欧美狂野欧美精品| 羞羞视频在线观看免费| 久久亚洲精品网站| 成人在线免费看片| 欧美老女人xx| 婷婷在线播放| 久久久久久香蕉网| 黄色在线看片| 高清视频欧美一级| 狠狠躁少妇一区二区三区| 97激碰免费视频| 女人让男人操自己视频在线观看| 午夜欧美大片免费观看| 蜜桃视频动漫在线播放| 欧美亚洲在线播放| 丝袜美腿诱惑一区二区三区| 国产99视频精品免视看7| 忘忧草在线www成人影院| 国产精品福利在线观看| 欧美v亚洲v综合v国产v仙踪林| 国产女精品视频网站免费| 亚洲电影二区| 91网免费观看| 欧美亚洲大陆| 日韩精品在在线一区二区中文| 久久精品国产68国产精品亚洲| 亚洲一区二区三区午夜| 一本精品一区二区三区| 亚洲色成人www永久在线观看 | 中文字幕第88页| 久久se精品一区精品二区| 黄色a级三级三级三级| 国产999精品久久| www.色天使| 国产精品美女久久久久久久久| 永久免费看片视频教学| 一级精品视频在线观看宜春院| 亚洲视频免费播放| 在线视频你懂得一区二区三区| 国产又粗又大又爽| 亚洲精品一区二区三区影院| 嫩草在线播放| 欧美成人性色生活仑片| 涩涩在线视频| 成人黄色av免费在线观看| eeuss国产一区二区三区四区| 免费电影一区| 91国语精品自产拍| 久久黄色片视频| 久久精品国产免费| 秘密基地免费观看完整版中文| 久久精品在线观看| 欧美日韩亚洲国产另类| 色欧美片视频在线观看在线视频| 国产精品自偷自拍| 精品丝袜一区二区三区| 久草资源在线观看| 啪一啪鲁一鲁2019在线视频| 91麻豆精品一二三区在线| 久久爱av电影| 亚洲一区欧美| av无码精品一区二区三区| 国产福利一区二区三区在线视频| 午夜时刻免费入口| 亚洲一二三区在线观看| 中文字幕日产av| 亚洲激情小视频| 高清免费电影在线观看| 国产精品av免费在线观看| 91在线一区| 宅男av一区二区三区| 久久久夜夜夜| 国产精品扒开腿做爽爽爽a片唱戏| 国产精品麻豆网站| 特级做a爱片免费69| 欧美成人精品3d动漫h| 免费黄网站在线播放| 日韩免费在线看| 成人激情自拍| 黄黄视频在线观看| 毛片不卡一区二区| 欧美黄色一级生活片| 欧美日韩免费一区| 亚洲欧美国产高清va在线播放| 日韩一区二区精品视频| 日韩不卡视频在线观看| 久久精品国产精品国产精品污| 中文无码久久精品| 久久久久久久久久一区二区| 国产色婷婷亚洲99精品小说| 成人免费看片98欧美| 欧美zozo另类异族| 在线三级中文| 97av自拍| 欧美日本精品| 色哟哟在线观看视频| 亚洲猫色日本管| 国产视频一二三四区| 另类图片亚洲另类| 国产精品高清一区二区| 中文字幕中文字幕99| 精品综合久久久久久8888| 农村老熟妇乱子伦视频| 欧美视频中文一区二区三区在线观看| 欧美777四色影视在线| 热99久久精品| 国内精品久久久久久99蜜桃| av丝袜天堂网| 国产精品久久夜| 91亚洲视频在线观看| 久久久国产精品亚洲一区| 日本高清久久| 国产精品69久久久| 99精品一区二区| 中文字幕国产在线观看| 亚洲视频国产视频| 成人精品国产亚洲| 影音先锋亚洲视频| 国产九色精品成人porny| 九九视频免费看| 亚洲精品按摩视频| 日日夜夜天天综合| 亚洲欧洲久久| 国产1区2区3区精品美女| 日本熟妇乱子伦xxxx| 亚洲欧美国产精品专区久久| 精品欧美一区二区三区在线观看 | 黄色在线免费观看| 一区二区三区视频在线| 婷婷精品久久久久久久久久不卡| 中文字幕日韩一区二区三区| 国产精品一区二区无线| 日韩欧美亚洲国产| 国产一区二区av| 国产午夜久久av| 97视频久久久| 日本一区二区免费在线 | 久久天天久久| 黄频视频在线观看| 岛国av在线一区| www.com亚洲| 欧美裸身视频免费观看| 欧美日韩一区二区三区在线电影| 999香蕉视频| 亚洲另类春色国产| 三级做a全过程在线观看| 国产中文字幕91| 亚洲欧洲日本一区二区三区| 少妇av片在线观看| 欧美一级日韩不卡播放免费| 色网在线免费观看| 亚洲一区二区精品在线| 成人短视频下载| 中文字幕人妻丝袜乱一区三区| 久久久久久免费精品| 欧美成人自拍| 亚洲做受高潮无遮挡| 日韩一区和二区| 成人看片网站| 亚洲国产精品无码观看久久| 中文字幕第一页久久| 五月激情六月婷婷| 91久久极品少妇xxxxⅹ软件 | 欧美在线三级| 蜜桃av乱码一区二区三区|