JAVA實現附件分片上傳

  1. 項目需求
    由于文件服務器的限制,單次調用文件上傳接口上傳的附件的大小不能超過500MB,對于超過500MB的附件需要分片上傳
  2. 程序示例
    private Boolean uploadFile(File uploadFile, String uploadUrl, List<Object> fileList) {final long CHUNK_SIZE = 500L * 1024 * 1024; // 500MBlong fileSize = uploadFile.length();int totalChunk = (int) Math.ceil((double) fileSize / CHUNK_SIZE);double totalSizeInMB = fileSize / 1024.0 / 1024.0;String md5 = DigestUtils.md5Hex(uploadFile.getName());System.out.printf("開始上傳附件:%s,大小:%.2f MB,總分片:%d%n",uploadFile.getName(), totalSizeInMB, totalChunk);long startTime = System.currentTimeMillis(); // ? 開始時間try (RandomAccessFile raf = new RandomAccessFile(uploadFile, "r")) {for (int i = 0; i < totalChunk; i++) {int fileChunk = i + 1;long currentChunkSize = Math.min(CHUNK_SIZE, fileSize - i * CHUNK_SIZE);byte[] chunkData = new byte[(int) currentChunkSize];raf.seek(i * CHUNK_SIZE);raf.readFully(chunkData);try (CloseableHttpClient client = HttpClients.createDefault()) {HttpPost post = new HttpPost(uploadUrl);HttpEntity multipart = MultipartEntityBuilder.create().setCharset(StandardCharsets.UTF_8).setMode(HttpMultipartMode.RFC6532).addTextBody("fileName", uploadFile.getName().replaceFirst("\\.[^.]+$", ""), ContentType.TEXT_PLAIN.withCharset(StandardCharsets.UTF_8)).addTextBody("fileForm", uploadFile.getName().contains(".") ? uploadFile.getName().substring(uploadFile.getName().lastIndexOf('.') + 1) : "", ContentType.TEXT_PLAIN).addTextBody("fileChunk", String.valueOf(fileChunk), ContentType.TEXT_PLAIN).addTextBody("totalChunk", String.valueOf(totalChunk), ContentType.TEXT_PLAIN).addTextBody("md5", md5, ContentType.TEXT_PLAIN).addBinaryBody("file", chunkData, ContentType.DEFAULT_BINARY, uploadFile.getName()).build();post.setEntity(multipart);try (CloseableHttpResponse response = client.execute(post)) {int status = response.getStatusLine().getStatusCode();if (status == 200) {System.out.printf("分片 %d/%d 上傳成功,大小:%.2f MB%n",fileChunk, totalChunk, currentChunkSize / 1024.0 / 1024.0);if (fileChunk == totalChunk) {String json = EntityUtils.toString(response.getEntity(), "UTF-8");ObjectMapper mapper = new ObjectMapper();@SuppressWarnings("unchecked")Map<String, Object> result = mapper.readValue(json, Map.class);@SuppressWarnings("unchecked")List<Map<String, Object>> dataArray = (List<Map<String, Object>>) result.get("data");for (Map<String, Object> data : dataArray) {JSONObject file = new JSONObject();file.put("fileName",      data.get("fileName"));file.put("fileSize",      data.get("fileSize"));file.put("fileExtension", data.get("fileExtension"));file.put("fileFullName",  data.get("fileFullName"));file.put("id",            data.get("id"));file.put("fileSizeText",  data.get("fileSizeText"));file.put("url",           data.get("url"));file.put("md5",           data.get("md5"));file.put("shadowLinkCode",data.get("shadowLinkCode"));fileList.add(file);}}} else {System.err.printf("分片上傳失敗:%d/%d,HTTP Status = %d%n", fileChunk, totalChunk, status);return false;}}}}long endTime = System.currentTimeMillis(); // ? 結束時間double durationSeconds = (endTime - startTime) / 1000.0;double speed = totalSizeInMB / durationSeconds;System.out.printf("附件上傳完成:%s,總耗時:%.2f 秒,平均速度:%.2f MB/s%n",uploadFile.getName(), durationSeconds, speed);return true;} catch (IOException e) {e.printStackTrace();return false;}
    }
  3. 日志示例
    開始上傳附件:report.zip,大小:1100.00 MB,總分片:3
    分片 1/3 上傳成功,大小:500.00 MB
    分片 2/3 上傳成功,大小:500.00 MB
    分片 3/3 上傳成功,大小:100.00 MB
    附件上傳完成:report.zip,總耗時:18.32 秒,平均速度:60.08 MB/s

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

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

相關文章

PyTorch環境安裝

pytorch安裝 建議&#xff08;非常強烈的那種&#xff09;用Anaconda創建一個虛擬環境&#xff0c;用于運行安裝你的PyTorch conda create -n universal python3.9 1. 基礎認知 cuDNN&#xff08;CUDA Deep Neural Network library&#xff09;是 NVIDIA 開發的用于深度學習…

機場風云:AI 云廠商的暗戰,廣告大戰一觸即發

文 | 大力財經機場廣告牌背后&#xff0c;一場決定云計算未來格局的隱形戰爭已悄然打響。當你匆匆走過首都機場T3航站樓的通道&#xff0c;巨幅屏幕上“阿里云&#xff1a;開源的力量”與不遠處“百度智能云&#xff1a;AI落地領導者”的廣告交相輝映。它們精準鎖定著日均10萬的…

MLE-STAR:谷歌AI推出的機器學習工程新范式,一種搜索驅動、精準優化的智能代理

最近看到 Google AI 發布了一個叫 MLE-STAR&#xff08;Machine Learning Engineering via Search and Targeted Refinement&#xff09;的新系統&#xff0c;說實話&#xff0c;第一眼看完論文和相關介紹后&#xff0c;我是有點震撼的。這不只是一次簡單的“LLM 自動化”拼湊…

3-防火墻

防火墻 一 防火墻概述防火墻概述防火墻是一個位于內部網絡與外部網絡之間的安全系統&#xff08;網絡中不同區域之間&#xff09;&#xff0c;是按照一定的安全策略建立起來的硬件或軟件系統&#xff0c;用于流量控制的系統&#xff08;隔離&#xff09;&#xff0c;保護內部網…

python opencv 調用 海康威視工業相機(又全又細又簡潔)

1.準備工作 準備一個海康相機 下載MVS 和SDK 海康機器人-機器視覺-下載中心 2.python MVS示例 &#xff08;說明&#xff1a;MVS里有很多python示例&#xff0c;可以直接運行&#xff0c;但沒有用opencv&#xff09; 下載完MVS后&#xff0c;我們打開路徑安裝路徑 我的&#…

計算機基礎·linux系統

Finalshell 用于遠程操控vmware中的linux系統 獲取虛擬機的IP地址 ifconfig命令&#xff0c;重啟系統后IP地址可能會變化&#xff01;問題&#xff1a;vmware子系統沒有網絡連接 winRservices.msc啟動這些服務問題&#xff1a;配置正確但是finalshell連接失敗 更新子系統中的ss…

8.結構健康監測選自動化:實時數據 + 智能分析,遠超人工

第一次接觸結構健康自動化監測系統&#xff0c;感覺成本很高&#xff0c;比人工好在哪里&#xff1f; 人工檢測是依靠目測檢查或借助于便攜式儀器測量得到的信息&#xff0c;但是隨著整個行業的發展&#xff0c;傳統的人工檢測方法已經不能滿足檢測需求&#xff0c;從人工檢測到…

【慕伏白】Android Studio 配置國內鏡像源

文章目錄配置HTTP代理修改 gradle 鏡像地址修改 maven 鏡像源重新同步配置HTTP代理 進入File --> Settings --> Appearance & Behavior --> System Settings --> HTTP Proxy 勾選 Auto-detect proxy settings --> Automatic proxy configuration URL &…

Spring Cloud系列—LoadBalance負載均衡

上篇文章&#xff1a; Spring Cloud系列—Eureka服務注冊/發現https://blog.csdn.net/sniper_fandc/article/details/149937589?fromshareblogdetail&sharetypeblogdetail&sharerId149937589&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link …

如何使用 pnpm創建Vue 3 項目

? 一、什么是 pnpm&#xff1f; pnpm 是一種更快、更高效的 Node 包管理工具&#xff0c;替代 npm 或 yarn&#xff0c;具有&#xff1a; 更快的安裝速度更節省磁盤空間&#xff08;包復用&#xff09;嚴格的依賴管理二、使用 pnpm 創建 Vue 項目的完整流程 ? 第一步&#xf…

Vite vs. vue-cli 創建 Vue 3 項目的區別與使用場景

Vite vs. vue-cli 創建 Vue 3 項目的區別與使用場景 Vite 和 vue-cli 都是 Vue 官方推薦的腳手架工具&#xff0c;但它們的架構、構建方式和適用場景有所不同。以下是它們的對比&#xff1a;1. 核心區別對比項Vite (推薦&#x1f525;)vue-cli (傳統)構建工具基于 ESM Rollup基…

VC6800智能相機:賦能智能制造,開啟AI視覺新紀元

在工業自動化與智能化浪潮奔涌的今天&#xff0c;精準、高效、智能的視覺檢測已成為提升生產力和品質的關鍵核心。VC6800智能相機應運而生&#xff0c;它不僅僅是一部相機&#xff0c;更是一個集強大視覺硬件與前沿AI算法于一身的 “工業智眼”&#xff0c;正深刻改變著各個領域…

(Python)Python爬蟲入門教程:從零開始學習網頁抓取(爬蟲教學)(Python教學)

一、爬蟲基礎概念 什么是爬蟲&#xff1f; 網絡爬蟲&#xff08;Web Crawler&#xff09;是一種自動獲取網頁內容的程序&#xff0c;它像蜘蛛一樣在互聯網上"爬行"&#xff0c;收集和提取數據。 爬蟲應用場景&#xff1a; 搜索引擎&#xff08;Google、百度&#…

dify前端源碼部署詳細教程

這兩天突發奇想&#xff0c;能不能dify源碼部署我只部署個前端&#xff0c;后端、數據庫什么的還是原來docker部署dify的本地部署和遇到的問題。按邏輯來說應該是行得通的&#xff0c;我就親自操作了下試下。 我這邊就以我以前使用docker部署好的1.3.1版本為例。docker安裝參考…

Web地圖服務規范,WMS服務是什么

Web地圖服務規范&#xff0c;WMS服務是什么&#xff1f; WMS&#xff0c;全稱 Web Map Service (網絡地圖服務)&#xff0c;是有OGC(開放地理空間信息聯盟)制定的一項標準化協議。他的核心功能是允許客戶端&#xff08;比如網頁瀏覽器或者GIS桌面軟件&#xff09;通過互聯網或者…

北京手機基站數據分享:9.3萬點位+雙格式,解鎖城市通信「基礎設施地圖」

今天分享的是——??2023年7月北京市手機基站數據&#xff08;shpcsv雙格式&#xff09;??。92,785個基站點位&#xff08;覆蓋全市16區&#xff09;&#xff0c;WGS84坐標系直接能用&#xff0c;shp格式適配GIS軟件&#xff0c;csv格式方便Excel/Pandas分析&#xff01;文末…

Druid學習筆記 01、快速了解Druid中SqlParser實現

文章目錄前言介紹Druid代碼目錄介紹模塊一&#xff1a;Parser模塊二&#xff1a;Druid_SQL_AST在Druid SQL Parser中有哪些AST節點類型?熟悉常用的AST節點組成常用的SQLExpr有哪些&#xff1f;常用的SQLStatemment&#xff1f;SQLTableSourceSQLSelect & SQLSelectQuerySQ…

Rust中生命周期的理解與應用

在學習Rust編程語言時,理解生命周期(Lifetime)是非常關鍵的,因為它直接影響到代碼的安全性和性能。今天我們來深入探討Rust中的一個常見問題——生命周期的誤解和正確應用,結合實際代碼實例來說明。 生命周期的基本概念 Rust中的生命周期是用來確保引用(Reference)在其…

智慧感知新體驗:英飛凌雷達在智能家居的創新應用

隨著智慧家居快速發展&#xff0c;感知技術成為實現高效、便捷生活的關鍵。雷達作為非接觸、高精度的感測方案&#xff0c;正在家居應用中展現出巨大潛力。 本次研討會將由英飛凌大中華區雷達應用產品經理 Tommy Wan主講&#xff0c;分享他在智能門鈴、門鎖與安防攝像頭等應用…

AI:新書預告—從機器學習避坑指南(分類/回歸/聚類/可解釋性)到大語言模型落地手記(RAG/Agent/MCP),一場耗時5+3年的技術沉淀—“代碼可跑,經驗可抄”—【一個處女座的程序猿】攜兩本AI

AI&#xff1a;新書預告—從機器學習避坑指南(分類/回歸/聚類/可解釋性)到大語言模型落地手記(RAG/Agent/MCP)&#xff0c;一場耗時53年的技術沉淀—“代碼可跑&#xff0c;經驗可抄”—【一個處女座的程序猿】攜兩本AI實戰書終于正式來了&#xff01; 導讀&#xff1a;大家好&…