当前位置: 首页 > news >正文

10、《文件上传与下载:MultipartFile与断点续传设计》

文件上传与下载:MultipartFile与断点续传设计

一、基础文件上传与MultipartFile解析

1.1 Spring MVC文件上传基础

@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {if (!file.isEmpty()) {try {byte[] bytes = file.getBytes();Path path = Paths.get("uploads/" + file.getOriginalFilename());Files.write(path, bytes);return "redirect:/success";} catch (IOException e) {e.printStackTrace();}}return "redirect:/error";
}

1.2 MultipartFile核心方法解析

public interface MultipartFile {String getName();         // 表单字段名称String getOriginalFilename(); // 原始文件名String getContentType();  // MIME类型boolean isEmpty();        // 是否空文件long getSize();           // 文件字节大小byte[] getBytes() throws IOException;InputStream getInputStream() throws IOException;void transferTo(File dest) throws IOException;
}

二、大文件分片上传设计

2.1 分片上传原理

2.2 前端分片处理示例(JavaScript)

const CHUNK_SIZE = 5 * 1024 * 1024; // 5MBasync function uploadFile(file) {const fileHash = await calculateMD5(file);const chunks = Math.ceil(file.size / CHUNK_SIZE);for (let i = 0; i < chunks; i++) {const chunk = file.slice(i * CHUNK_SIZE, (i+1)*CHUNK_SIZE);const formData = new FormData();formData.append('chunk', chunk);formData.append('chunkNumber', i);formData.append('totalChunks', chunks);formData.append('fileHash', fileHash);await axios.post('/api/upload-chunk', formData);}
}

2.3 后端分片接收处理

@PostMapping("/upload-chunk")
public ResponseEntity<?> uploadChunk(@RequestParam("chunk") MultipartFile chunk,@RequestParam("chunkNumber") int chunkNumber,@RequestParam("totalChunks") int totalChunks,@RequestParam("fileHash") String fileHash) {String tempDir = "temp/" + fileHash + "/";FileUtils.forceMkdir(new File(tempDir));try {chunk.transferTo(new File(tempDir + chunkNumber));return ResponseEntity.ok().build();} catch (IOException e) {return ResponseEntity.status(500).build();}
}

三、断点续传关键技术

3.1 断点续传实现要素

  • 唯一文件标识(MD5/SHA1)
  • 分片索引记录
  • 已上传分片校验
  • 分片合并策略

3.2 断点信息存储(Redis示例)

@Service
public class UploadProgressService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;private static final String UPLOAD_PROGRESS_KEY = "upload:progress:";public void saveProgress(String fileHash, Set<Integer> chunks) {redisTemplate.opsForSet().add(UPLOAD_PROGRESS_KEY + fileHash, chunks.toArray(new Integer[0]));}public Set<Integer> getProgress(String fileHash) {return redisTemplate.opsForSet().members(UPLOAD_PROGRESS_KEY + fileHash).stream().map(o -> (Integer)o).collect(Collectors.toSet());}
}

四、OSS云存储集成方案

4.2 阿里云OSS分片上传示例

// OSS配置类
@Configuration
public class OssConfig {@Value("${oss.endpoint}")private String endpoint;@Value("${oss.accessKey}")private String accessKey;@Value("${oss.secretKey}")private String secretKey;@Beanpublic OSS ossClient() {return new OSSClientBuilder().build(endpoint, accessKey, secretKey);}
}// 分片上传服务
@Service
@RequiredArgsConstructor
public class OssUploadService {private final OSS ossClient;public String multipartUpload(String bucketName, String objectName, File file) {InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request);String uploadId = result.getUploadId();// 分片上传逻辑List<PartETag> partETags = new ArrayList<>();long contentLength = file.length();int partSize = 5 * 1024 * 1024; // 5MBtry (FileInputStream fis = new FileInputStream(file)) {for(int i = 1; fis.available() > 0; i++) {UploadPartRequest uploadPartRequest = new UploadPartRequest();uploadPartRequest.setBucketName(bucketName);uploadPartRequest.setKey(objectName);uploadPartRequest.setUploadId(uploadId);uploadPartRequest.setInputStream(fis);uploadPartRequest.setPartSize(partSize);uploadPartRequest.setPartNumber(i);UploadPartResult uploadResult = ossClient.uploadPart(uploadPartRequest);partETags.add(uploadResult.getPartETag());}CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);ossClient.completeMultipartUpload(completeRequest);return objectName;}}
}

五、完整项目目录结构

file-upload-demo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           ├── config/
│   │   │           │   └── OssConfig.java
│   │   │           ├── controller/
│   │   │           │   └── FileController.java
│   │   │           ├── service/
│   │   │           │   ├── UploadService.java
│   │   │           │   └── impl/
│   │   │           │       ├── LocalUploadServiceImpl.java
│   │   │           │       └── OssUploadServiceImpl.java
│   │   │           ├── util/
│   │   │           │   └── FileUtils.java
│   │   │           └── FileUploadDemoApplication.java
│   │   └── resources/
│   │       ├── application.yml
│   │       └── static/
├── pom.xml
└── README.md

六、性能优化建议

  1. 动态分片大小调整(网络质量检测)
  2. 并行分片上传(前端Promise.all)
  3. 客户端计算文件指纹(Web Worker)
  4. 分片完整性校验(SHA-256)
  5. 自动重试机制(指数退避策略)

总结

本文从基础文件上传实现出发,深入剖析了分片上传与断点续传的核心技术,并结合云存储服务给出了企业级解决方案。示例代码可直接集成到Spring Boot项目中,建议根据实际业务需求调整分片策略和存储方案。

相关文章:

10、《文件上传与下载:MultipartFile与断点续传设计》

文件上传与下载&#xff1a;MultipartFile与断点续传设计 一、基础文件上传与MultipartFile解析 1.1 Spring MVC文件上传基础 PostMapping("/upload") public String handleFileUpload(RequestParam("file") MultipartFile file) {if (!file.isEmpty())…...

DeepSeek 本地部署(电脑安装)

1.先安装Ollama 开源框架 网址链接为:Ollama 2.点中间的下载 3.选系统 4.下载好就安装 5.输入命令ollama -v 6.点击Model 7.选如下 8.选版本 9.复杂对应命令 10.控制台粘贴下载 11.就可以问问题啦 12.配置UI界面(在扩展里面输入) 13.配置完即可打开 14.选择刚才安装的就好啦…...

DeepSeek、Kimi、文心一言、通义千问:AI 大语言模型的对比分析

在人工智能领域&#xff0c;DeepSeek、Kimi、文心一言和通义千问作为国内领先的 AI 大语言模型&#xff0c;各自展现出了独特的特点和优势。本文将从技术基础、应用场景、用户体验和价格与性价比等方面对这四个模型进行对比分析&#xff0c;帮助您更好地了解它们的特点和优势。…...

Docker compose 以及镜像使用

Docker compose 以及镜像使用 高级配置 使用 Docker Compose Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。以下是一个 docker-compose.yml 示例&#xff1a; version: 3 services:web:image: my-appbuild: .ports:- "8000:8000"volumes:- …...

HCIA项目实践--RIP相关原理知识面试问题总结回答

9.4 RIP 9.4.1 补充概念 什么是邻居&#xff1f; 邻居指的是在网络拓扑结构中与某一节点&#xff08;如路由器&#xff09;直接相连的其他节点。它们之间可以直接进行通信和数据交互&#xff0c;能互相交换路由信息等&#xff0c;以实现网络中的数据转发和路径选择等功能。&am…...

使用Python进行云计算:AWS、Azure、和Google Cloud的比较

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python进行云计算&#xff1a;AWS、Azure、和Google Cloud的比较 随着云计算的普及&am…...

c++ 实现矩阵乘法

矩阵乘法的基本实现方法是三层循环&#xff0c;但不同的循环顺序会影响性能&#xff0c;比如i-j-k和i-k-j的顺序。然后&#xff0c;参考内容里提到了一些优化方法&#xff0c;比如调整循环顺序来提高缓存命中率&#xff0c;使用一维数组存储矩阵&#xff0c;或者利用SIMD指令如…...

无线4G多联机分户计费集中控制系统

拓森无线4G多联机集中控制系统应用于宝龙广场多联机计费集中控制节能改造项目&#xff0c;包括多联机集中控制&#xff0c;分户计费&#xff0c;空调监控管理、告警管理、节能管控、统计报表、能效分析、空调远程开关机等功能。项目的成功实施&#xff0c;不仅提升了维护管理效…...

文字转语音(一)各种实现说明

记录下文字转语音的各种方式及优缺点 目前只了解了调用 Windows PowerShell&#xff08;System.Speech.Synthesis&#xff09;、FreeTTS、JACOB&#xff08;Java COM Bridge&#xff09;库实现文字转语音。 其他的方式就是顺带记录了解下 Windows PowerShell&#xff08;System…...

大语言模型多代理协作(MACNET)

大语言模型多代理协作(MACNET) Scaling Large-Language-Model-based Multi-Agent Collaboration 提出多智能体协作网络(MACNET),以探究多智能体协作中增加智能体数量是否存在类似神经缩放定律的规律。研究发现了小世界协作现象和协作缩放定律,为LLM系统资源预测和优化…...

【笛卡尔树】

笛卡尔树 笛卡尔树定义构建性质 习题P6453 [COCI 2008/2009 #4] PERIODNICF1913D Array CollapseP4755 Beautiful Pair[ARC186B] Typical Permutation Descriptor 笛卡尔树 定义 笛卡尔树是一种二叉树&#xff0c;每一个节点由一个键值二元组 ( k , w ) (k,w) (k,w) 构成。要…...

Java堆外内存的高效利用与性能优化

在Java开发中&#xff0c;堆外内存&#xff08;Direct Memory&#xff09;是除Java堆以外的内存区域。它允许Java程序直接分配和管理非堆内存&#xff0c;这为高性能的数据处理提供了可能。 1、 什么是堆外内存&#xff1f; 堆外内存&#xff0c;也称为直接内存&#xff08;D…...

【Unity3D优化】使用ASTC压缩格式优化内存

在Unity3D手游开发中&#xff0c;合理选择纹理压缩格式对于优化内存占用、提高渲染效率至关重要。本文将记录近期在项目内进行的图片压缩格式优化过程&#xff0c;重点介绍从ETC2到ASTC 5x5的优化方案及其带来的收益。 1. 现状分析&#xff1a;从ETC2到ASTC 6x6 block 在项目…...

iptables网络安全服务详细使用

iptables防火墙概念说明 开源的基于数据包过滤的网络安全策略控制工具。 centos6.9 --- 默认防火墙工具软件iptables centos7 --- 默认防火墙工具软件firewalld&#xff08;zone&#xff09; iptables主要工作在OSI七层的二、三、四层&#xff0c;如果重新编译内核&…...

MiC建筑引领未来:中建海龙的探索与实践

随着全球城市化进程的加速推进&#xff0c;建筑行业正面临着前所未有的挑战与机遇。如何高效、环保地建造高质量的建筑&#xff0c;成为了行业内外普遍关注的焦点。在此背景下&#xff0c;MiC&#xff08;Modular Integrated Construction&#xff0c;模块化集成建筑&#xff0…...

清华精品资料:DeepSeek从入门到精通、DeepSeek赋能职场

今天电脑天空给大家推荐2份清华大学专家编写的DeepSeek的使用手册&#xff0c;分别是《DeepSeek从入门到精通》和《DeepSeek赋能职场》。 《DeepSeek从入门到精通》是一本系统化的技术指南&#xff0c;旨在帮助用户从零基础到精通掌握通用人工智能模型DeepSeek的核心功能与应用…...

Nginx进阶篇 - nginx多进程架构详解

文章目录 1. nginx的应用特点2. nginx多进程架构2.1 nginx多进程模型2.2 master进程的作用2.3 进程控制2.4 worker进程的作用2.5 worker进程处理请求的过程2.6 nginx处理网络事件 1. nginx的应用特点 Nginx是互联网企业使用最为广泛的轻量级高性能Web服务器&#xff0c;其特点是…...

SpringBoot初始化8个常用方法

在 Spring Boot 中&#xff0c;初始化方法通常是在应用程序启动时被调用的&#xff0c;可以用来执行应用启动时的一些准备工作。以下是几种常见的初始化方法&#xff1a; 一、顺序 1. 图解 ┌─────────────────────────────┐│ Spring Boot…...

boolen盲注和时间盲注

获取当前数据库名 import requestsdef inject_database(url):namemax_length20low{a: 97, z: 122, A: 65, Z: 90, 0: 48, 9: 57, _: 95}high{97: a, 122: z, 65: A, 90: Z, 48: 0, 57: 9, 95: _}for i in range(1, max_length 1):low_val32high_val122while low_val < hi…...

CTF-web:java-h2 堆叠注入rec -- N1ctf Junior EasyDB

代码存在sql注入 // 处理登录表单的POST请求PostMapping({"/login"})public String handleLogin(RequestParam String username, RequestParam String password, HttpSession session, Model model) throws SQLException {// 验证用户凭据if (this.userService.valid…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...