1. 项目背景与核心需求
在互联网企业的日常运营中,大文件传输一直是个令人头疼的问题。记得去年我们团队接手一个政府项目时,客户需要每周传输上百GB的GIS地理数据,传统的FTP方式不仅速度慢,还经常因为网络波动导致传输中断,每次都要从头开始。这种场景下,一个支持断点续传、文件夹结构保持的大文件传输系统就显得尤为重要。
这套JavaWeb解决方案主要解决以下几个痛点:
- 超大文件(50GB以上)的可靠传输
- 保持原始文件夹层级结构
- 网络中断后能够从断点继续传输
- 跨平台兼容性(包括陈旧的IE8浏览器)
- 企业级的数据加密需求
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 整体架构解析
系统采用分层架构设计,各层职责分明:
code复制[前端Vue2] ←HTTP→ [JSP服务层] ←→ [文件分块处理层] ←→ [阿里云OSS]
↑
↓
[MySQL元数据库]
这种设计的优势在于:
- 前端与业务逻辑分离,Vue负责交互,JSP处理业务
- 文件操作与业务逻辑分离,专门的文件处理层提高性能
- 元数据与文件存储分离,MySQL记录状态,OSS存储实际文件
2.2 关键技术选型
-
文件存储:阿里云OSS对象存储
- 选择理由:相比自建文件服务器,OSS提供99.999999999%的数据可靠性,且无需考虑扩容问题
- 成本考量:采用低频访问存储类型,比标准存储节省约40%成本
-
分块策略:
- 默认分块大小:5MB(可配置)
- 计算公式:
分块数 = ceil(文件大小/分块大小) - 经验值:经过测试,5MB分块在HTTP传输中最能平衡网络利用率和内存消耗
-
加密方案:
java复制// 加密工厂示例 public class EncryptorFactory { public static Encryptor getEncryptor(String type) { switch(type) { case "SM4": return new SM4Encryptor(); // 国密标准 case "AES": return new AESEncryptor(); // 国际标准 default: throw new IllegalArgumentException("不支持的加密类型"); } } }
3. 核心功能实现细节
3.1 分块上传机制
文件上传的核心流程:
- 前端计算文件MD5作为唯一标识
- 查询服务端是否已有相同文件(秒传实现)
- 按5MB分块上传,每个分块独立传输
- 服务端接收分块后立即持久化
- 全部分块上传完成后触发合并
关键代码示例:
java复制@WebServlet("/uploadChunk")
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
String fileId = req.getParameter("fileId");
int chunkNumber = Integer.parseInt(req.getParameter("chunkNumber"));
// 加密处理
InputStream encryptedStream = EncryptorFactory
.getEncryptor(Config.getEncryptType())
.encrypt(req.getInputStream());
