精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲欧洲成人自拍| 国产欧美一区二区色老头| 精品视频123区在线观看| 日本一区不卡| 国产精品久久777777换脸| 欧美黄色录像片| 日韩女同互慰一区二区| 男人用嘴添女人下身免费视频| 蜜桃视频在线播放| 久久不射2019中文字幕| 日韩一区二区三区国产| 国产又粗又长又爽| 123成人网| 亚洲综合色成人| 欧美高清性xxxxhdvideosex| 国产免费的av| 国产精品久久久久久模特 | 国产欧美三级电影| 91国在线观看| 久久视频在线观看免费| 91九色蝌蚪porny| 99re久久| 欧美日韩国产区| 先锋影音男人资源| 国产久一道中文一区| 超碰在线播放91| 女子免费在线观看视频www| 91免费观看视频| 国产欧美婷婷中文| 毛片基地在线观看| 欧美国产先锋| 色狠狠av一区二区三区香蕉蜜桃| xxxwww国产| 久久国产精品美女| 欧美无人高清视频在线观看| ww国产内射精品后入国产| 超碰超碰在线| 国产精品久久久久久久蜜臀| 久久综合一区| 丁香花免费高清完整在线播放| 开心九九激情九九欧美日韩精美视频电影| 久久久久久久久久国产精品| www深夜成人a√在线| 青青操综合网| 亚洲第一区中文字幕| 手机在线播放av| 亚洲ww精品| 欧美日韩中文国产| 国产又黄又猛视频| 亚洲欧洲自拍| 一本大道久久a久久综合| 99视频在线免费播放| 黄页网站在线| 亚洲自拍偷拍欧美| 成人污网站在线观看| 成人日韩欧美| 亚洲精选一二三| 国产香蕉一区二区三区| 黄色免费在线看| 综合久久久久久| 中国成人在线视频| 免费av网站在线观看| 国产精品女同互慰在线看| 神马欧美一区二区| yourporn在线观看中文站| 国产女同互慰高潮91漫画| 日韩videos| 日本三级视频在线观看| 国产精品久久久久久久久久免费看| 涩涩日韩在线| 亚洲色图27p| 91亚洲国产成人精品一区| 日韩电影在线免费看| 国产精品久久久久久超碰| 中文有码在线播放| 美女网站色91| 亚洲综合日韩在线| 欧美特级特黄aaaaaa在线看| av网站免费线看精品| 蜜桃成人在线| √天堂资源地址在线官网| 国产精品的网站| 国产精品av免费| 伊人手机在线| 精品国产乱码久久久久久天美| 欧美啪啪免费视频| 欧美暴力调教| 日韩一区二区在线免费观看| 久久久一二三四| 黄色网址在线免费| 一区二区三区四区av| 日韩xxxx视频| 欧美123区| 日韩一级高清毛片| 91av在线免费| 98精品视频| 国内精品久久久久影院优 | 国产成人久久精品| 国产一区二区三区在线观看| 久久久成人av毛片免费观看| 久久综合久色欧美综合狠狠| 一区不卡字幕| 青草在线视频在线观看| 欧美午夜片欧美片在线观看| av在线网址导航| 黄色欧美网站| 中文字幕日韩免费视频| 久久精品视频久久| 蜜桃一区二区三区在线| 国产精品视频免费一区| 99精品老司机免费视频| 亚洲一区在线观看视频| 天天影视综合色| 999久久久精品一区二区| 伊人激情综合网| 国产精品.www| 国产在线精品国自产拍免费| 欧洲久久久久久| 超碰97免费在线| 欧美精品vⅰdeose4hd| 波多野结衣福利| 亚洲欧美综合国产精品一区| 国产精品美女视频网站| 无码国产精品96久久久久| 亚洲欧美成人一区二区三区| av无码精品一区二区三区| 97一区二区国产好的精华液| yellow中文字幕久久| 无码人妻丰满熟妇精品区| 大尺度一区二区| 伊人av成人| a成人v在线| 亚洲午夜av久久乱码| 99免费在线观看| 国产精品主播直播| 在线播放豆国产99亚洲| 四虎4545www精品视频| 日韩成人中文字幕| 国产精选第一页| 国产精品一区二区在线观看不卡 | 欧美综合一区| 欧美做受高潮电影o| 一级黄色大片儿| 精品国产亚洲av麻豆| 波多野结衣视频一区| 91大学生片黄在线观看| 91精品亚洲一区在线观看| 中文字幕日韩免费视频| 久久久久久亚洲av无码专区| 久久青草欧美一区二区三区| 1024av视频| 精品少妇一区| 亚洲91av视频| 亚洲av成人无码网天堂| 精品电影在线观看| 波多野结衣影院| 在线视频日韩| 精品亚洲欧美日韩| 中老年在线免费视频| 日韩电影视频免费| 亚洲影院在线播放| 久久精品人人做人人爽97| 日韩一级片播放| 第一会所sis001亚洲| 国产精品丝袜视频| 黄视频网站在线看| 欧美一区二区三区啪啪| 青青草激情视频| 成人爽a毛片一区二区免费| 无码人妻少妇伦在线电影| 女同久久另类99精品国产| 66m—66摸成人免费视频| 午夜国产在线观看| 欧美视频一区二区三区…| 熟女少妇内射日韩亚洲| 日本在线不卡视频| 欧美日韩视频免费在线观看| 日韩一区二区三区在线看| 欧美精品18videos性欧美| 天天干天天色天天| 欧美自拍丝袜亚洲| 日韩不卡av在线| 国产一区二区免费看| 国产va亚洲va在线va| 亚洲精品国模| 国产精品一区二区三区免费视频 | 男人添女人下部视频免费| 国产一区调教| 国产精品99蜜臀久久不卡二区| 欧美成人xxx| 精品日本一线二线三线不卡| 女人十八岁毛片| 国产精品久久久久久久久久久免费看 | 欧美色涩在线第一页| 日韩成人短视频| 99久久综合国产精品| 久久撸在线视频| 亚洲免费高清| 一区二区免费电影| 麻豆精品少妇| 国产日韩中文字幕在线| 69av成人| 日韩中文娱乐网| 亚洲欧洲综合在线| 在线播放中文字幕一区| 日韩精品一区二区三区国语自制| 国产精品你懂的在线欣赏| 久草视频福利在线| 奇米一区二区三区| 国产真实老熟女无套内射| 第九色区aⅴ天堂久久香| 精品国产一区二区三区麻豆小说 | 视频精品一区二区| 成人毛片100部免费看| 红桃成人av在线播放| 鬼打鬼之黄金道士1992林正英| 唐人社导航福利精品| 欧美极品少妇xxxxx| 免费av在线播放| 一区二区三区亚洲| 天堂中文在线资| 欧美一区二区三区日韩| 一区二区自拍偷拍| 欧美日韩午夜剧场| 久久综合亚洲色hezyo国产| 中文字幕第一页久久| 国产精品无码一区二区三区免费 | 91在线视频免费看| 日韩电影网在线| 免费观看国产视频| 91精品国产色综合久久| 姑娘第5集在线观看免费好剧| 偷拍一区二区三区四区| 美女福利视频在线观看| 最新国产成人在线观看| 日韩福利在线视频| 国产日韩欧美a| 欧美丰满少妇人妻精品| 成人h动漫精品一区二区| 两性午夜免费视频| 激情图片小说一区| 三级视频中文字幕| 视频在线在亚洲| 国产最新免费视频| 99精品国产在热久久| 欧妇女乱妇女乱视频| 亚洲精品小说| 天天干天天色天天爽| 99久久夜色精品国产亚洲96 | 亚洲天堂激情| 2018中文字幕第一页| 欧美午夜一区| www.av蜜桃| 亚洲片区在线| 国产v片免费观看| 国产日韩一区| 国产综合av在线| 亚久久调教视频| 白嫩少妇丰满一区二区| 久久午夜激情| 久久久久国产一区| 精品一区二区影视| 日韩不卡的av| 成人激情小说乱人伦| 久久久午夜精品福利内容| 99精品桃花视频在线观看| 制服丝袜第一页在线观看| av欧美精品.com| 性欧美13一14内谢| 欧美激情一区二区三区在线| 成年人视频软件| 亚洲欧美日韩国产中文在线| 久久久久久久黄色| 午夜激情综合网| 中文字幕精品视频在线观看| 欧美日韩国产影片| 国产日韩精品suv| 精品少妇一区二区三区免费观看 | 国产成人免费av一区二区午夜| 91在线无精精品一区二区| 999久久久久久久久6666| 久久精品第九区免费观看 | 亚洲欧美国产精品va在线观看| 成黄免费在线| 久久99精品久久久久久琪琪| 黄色在线观看www| 国产成人免费av| 9999精品免费视频| 国产在线一区二| 日本电影一区二区| 国产精品视频二| 久久精品中文| 日本在线观看视频一区| 99国产一区二区三精品乱码| 欧美亚洲另类久久综合| 天堂在线视频观看| 亚洲人成电影网站色| 黄网站在线免费| 国产91成人video| 国产精品日本一区二区三区在线 | 免费成人高清在线视频theav| 一区二区欧美日韩| 99精品视频免费观看视频| 成人亚洲精品777777大片| 成人性生交大片免费看视频在线| 久操视频在线观看免费| 亚洲综合自拍偷拍| 成人黄色三级视频| 精品国产网站在线观看| av资源在线观看免费高清| 欧美劲爆第一页| 小说区图片区亚洲| 日本午夜精品一区二区| 欧美日韩蜜桃| 中文字幕久久av| 久久亚洲影视婷婷| 五月婷婷一区二区| 欧美日韩一级视频| 欧美日韩伦理片| 高清一区二区三区日本久| 99精品女人在线观看免费视频| 蜜桃av久久久亚洲精品| 欧美色一级片| 日本高清久久久| 久久精品亚洲精品国产欧美| 久久精品久久国产| 日韩一区二区三区免费看 | 久久激情av| 国产经典久久久| 久久国产精品免费| 久久久久久久毛片| 欧美性猛交xxxx免费看久久久| 亚洲精选一区二区三区| 精品国内产的精品视频在线观看| 亚洲人免费短视频| 麻豆av福利av久久av| 日韩天天综合| 国产精品手机在线观看| 一区二区三区日韩欧美精品| 一级日韩一级欧美| 在线播放国产精品| 国产精品高清乱码在线观看 | 欧美久久久久久久久久久| 亚洲特黄一级片| 91麻豆视频在线观看| 色偷偷av亚洲男人的天堂| jizz亚洲女人高潮大叫| 欧美主播一区二区三区美女 久久精品人| 99精品视频免费观看视频| 波多野结衣视频播放| 午夜久久久影院| 香蕉久久一区二区三区| 97超碰国产精品女人人人爽| 久本草在线中文字幕亚洲| 免费av手机在线观看| 99国产精品视频免费观看| 日韩av男人天堂| 亚洲精品国产美女| 成人午夜电影免费在线观看| 国产精品va| 国产美女视频免费观看下载软件| 性久久久久久久久| 亚洲 精品 综合 精品 自拍| 18一19gay欧美视频网站| 亚洲人成网www| 992kp快乐看片永久免费网址| 国产精品美日韩| 国产色综合视频| 欧美黑人xxx| 欧美电影免费网站| 中文字幕欧美精品日韩中文字幕| 亚洲永久精品一区| 亚洲欧洲日产国产网站| 欧美日韩五区| 亚洲一区二三| 成人做爰69片免费看网站| 日韩乱码一区二区| 国产亚洲视频在线| 国产美女亚洲精品7777| 精品少妇人欧美激情在线观看| 91在线精品一区二区| 国产一级片一区二区| 成人97在线观看视频| 欧美人妖在线观看| 日本美女高潮视频| 亚洲一区二区在线观看视频 | 中文字幕欧美日韩| 老司机亚洲精品一区二区| 91成人在线观看喷潮教学| 国产精品丝袜黑色高跟| 亚洲成人第一区| 国产成人极品视频| 中文字幕免费精品| www.自拍偷拍| 91精品啪在线观看国产60岁| 色在线中文字幕| 国产日韩视频在线播放| 久久综合色8888| 亚洲av综合色区无码一区爱av | 亚洲一区av|