大文件传输系统技术方案(北京教育行业国企项目)

一、系统架构设计

1.1 总体架构

渲染错误: Mermaid 渲染失败: Parse error on line 2: ... A[客户端] --> B[网关层(Nginx+Lua)] B - -----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'

1.2 技术选型

  • 后端框架:SpringBoot 2.7.x + JSP(兼容模式)
  • 前端框架:Vue2/React/Angular多框架适配层
  • 加密算法:SM4(国密) + AES(动态配置)
  • 断点续传:Redis持久化存储 + 数据库备份
  • 文件夹结构:自定义JSON元数据协议

二、核心功能实现

2.1 分块上传(后端关键代码)

// FileChunkController.java (SpringBoot)
@RestController
public class FileChunkController {
    
    @Value("${storage.type}")
    private String storageType;

    @PostMapping("/upload/chunk")
    public ResponseEntity handleChunk(
        @RequestParam("file") MultipartFile file,
        @RequestParam("md5") String md5,
        @RequestParam("chunkIndex") int chunkIndex) {
        
        // 1. 保存分片到临时目录
        Path tempPath = Paths.get("/temp/uploads", md5, chunkIndex + "");
        Files.createDirectories(tempPath.getParent());
        Files.write(tempPath, file.getBytes(), StandardOpenOption.CREATE);

        // 2. 更新进度到Redis
        redisTemplate.opsForSet().add("upload_progress:" + md5, chunkIndex + "");

        // 3. 检查是否完成
        if (isAllChunksUploaded(md5)) {
            // 合并分片
            mergeChunks(md5);
            // 加密存储
            encryptFile(md5, getEncryptionAlgorithm());
        }

        return ResponseEntity.ok().build();
    }

    private String getEncryptionAlgorithm() {
        return configService.getEncryptionType(); // 动态配置
    }
}

2.2 加密存储(前端示例)

// crypto-adapter.js (框架无关加密层)
export class CryptoAdapter {
    constructor(algorithm = 'SM4') {
        this.algorithm = algorithm;
    }

    encrypt(file) {
        return new Promise((resolve) => {
            if (this.algorithm === 'SM4') {
                // 国密加密
                const sm4 = new SM4();
                resolve(sm4.encrypt(file));
            } else {
                // AES加密
                const aes = new AES();
                resolve(aes.encrypt(file));
            }
        });
    }
}

2.3 断点续传(前端核心逻辑)

// upload-manager.js (Vue2/React通用)
class UploadManager {
    constructor() {
        this.progressCache = new Map();
    }

    async resumeUpload(file, md5) {
        const progress = await this.getProgress(md5);
        const chunks = this.createChunks(file);

        for (let i = 0; i < chunks.length; i++) {
            if (!progress.has(i)) {
                await this.uploadChunk(chunks[i], md5, i);
            }
        }

        // 触发合并请求
        await fetch('/upload/merge', {
            method: 'POST',
            body: JSON.stringify({ md5, totalChunks: chunks.length })
        });
    }

    getProgress(md5) {
        // 优先从本地缓存获取
        if (this.progressCache.has(md5)) {
            return Promise.resolve(this.progressCache.get(md5));
        }
        // 否则从服务端获取
        return fetch('/upload/progress/' + md5)
            .then(res => res.json());
    }
}

三、兼容性解决方案

3.1 IE8兼容方案



3.2 跨框架适配层

// framework-adapter.js
export class FrameworkAdapter {
    static getUploadComponent() {
        if (window.Vue) {
            return require('./vue-adapter').default;
        } else if (window.React) {
            return require('./react-adapter').default;
        }
        throw new Error('Unsupported framework');
    }
}

四、部署与集成

4.1 动态存储配置(application.yml)

storage:
  type: ${STORAGE_TYPE:oss} # 支持oss/local/s3
  oss:
    access-key: ${OSS_ACCESS_KEY}
    secret-key: ${OSS_SECRET_KEY}
    endpoint: ${OSS_ENDPOINT}
  local:
    base-path: /data/files

4.2 数据库兼容配置

// DatabaseConfig.java
@Configuration
public class DatabaseConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        String dbType = env.getProperty("spring.datasource.type", "mysql");
        switch (dbType) {
            case "oracle":
                return new OracleDataSource();
            case "sqlserver":
                return new SQLServerDataSource();
            default:
                return new HikariDataSource();
        }
    }
}

五、厂商合作要求

5.1 交付物清单

  1. 完整源码(含前后端、编译脚本)
  2. 国产化适配认证报告(麒麟/统信UOS)
  3. 加密算法合规证明(SM4商用许可)
  4. 5个以上央企合作案例(需提供合同关键页)
  5. 7×24小时技术支持承诺书

5.2 预算分配

项目 金额(万元) 说明
源码授权 68 永久使用+商业许可
定制开发 20 兼容IE8/信创环境适配
技术培训 10 3次现场培训(每次2天)
合计 98

六、实施计划

  1. 需求确认(1周):完成详细需求规格说明书
  2. POC验证(3周):实现核心功能原型
  3. 兼容性测试(4周):完成IE8/信创环境适配
  4. 全量交付(6周):提供完整源码及文档
  5. 培训支持(1周):现场技术转移

本方案已通过集团技术委员会评审,现进入商务选型阶段,欢迎符合要求的厂商提交正式方案及报价。

导入项目

导入到Eclipse:点南查看教程
导入到IDEA:点击查看教程
springboot统一配置:点击查看教程

工程

image

NOSQL

NOSQL示例不需要任何配置,可以直接访问测试
image

创建数据表

选择对应的数据表脚本,这里以SQL为例
image
image

修改数据库连接信息

image

访问页面进行测试

image

文件存储路径

up6/upload/年/月/日/guid/filename
image
image

效果预览

文件上传

文件上传

文件刷新续传

支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传
文件续传

文件夹上传

支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。
文件夹上传

下载示例

点击下载完整示例

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐