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

文件上传与诉讼资料关联表设计实战

在表外贷款诉讼模块中,我们需要支持 多文件上传 功能,例如上传判决书扫描件、庭审记录照片、协议 PDF 等,并且这些文件需要和诉讼记录进行关联。下面我结合项目中的实践,分享一下设计与实现思路。


一、文件存储核心接口

我们首先定义了 FileService 接口,主要包含文件分页、上传、删除、预签名地址获取等方法。核心方法是:

/*** 保存文件,并返回文件的访问路径** @param content 文件内容* @param name    文件名称* @param directory 目录* @param type    文件 MIME 类型* @param module  业务模块(例如 bank、system)* @return 文件访问路径*/
String createFile(@NotEmpty(message = "文件内容不能为空") byte[] content,String name, String directory, String type, String module);

 

实现类 FileServiceImpl 负责生成文件路径、调用底层存储(本地/MinIO/OSS 等)、保存数据库记录。


二、文件存储实现逻辑

关键实现步骤如下:

  1. 补全文件名和后缀

    • 若文件名为空,则使用 SHA256 内容摘要作为文件名

    • 若缺少后缀,则通过 MIME 类型补全

  2. 生成唯一存储路径

    • 目录:例如 lawsuit

    • 日期:按 yyyyMMdd 分目录

    • 后缀:拼接时间戳避免覆盖

    最终效果类似:

lawsuit/20250908/judgement_1725805818000.pdf
  1. 上传到存储服务
    调用 FileClient.upload(content, path, type),获得文件 URL。

  2. 保存数据库记录
    插入到 file 表,记录配置 ID、文件名、路径、URL、模块、大小等。

代码核心片段:

 

@Override
@SneakyThrows
public String createFile(byte[] content, String name, String directory, String type, String module) {if (StrUtil.isEmpty(type)) {type = FileTypeUtils.getMineType(content, name);}if (StrUtil.isEmpty(name)) {name = DigestUtil.sha256Hex(content);}if (StrUtil.isEmpty(FileUtil.extName(name))) {String extension = FileTypeUtils.getExtension(type);name = name + extension;}String path = generateUploadPath(name, directory);FileClient client = fileConfigService.getMasterFileClient();String url = client.upload(content, path, type);fileMapper.insert(new FileDO().setConfigId(client.getId()).setName(name).setPath(path).setUrl(url).setModule(module).setType(type).setSize(content.length));return url;
}

三、诉讼资料文件上传逻辑

业务侧只需要调用 fileService.createFile(...) 即可完成文件上传。我们以诉讼记录上传附件为例:

List<String> urls = new ArrayList<>();
if (files != null) {for (MultipartFile file : files) {if (file == null || file.isEmpty()) {continue;}try {// 调用文件服务上传String url = fileService.createFile(file.getBytes(),file.getOriginalFilename(),"lawsuit",                // 文件目录file.getContentType(),"bank"                    // 模块标识);urls.add(url);// 保存到诉讼附件表LoanOutLawsuitFileDO f = new LoanOutLawsuitFileDO();f.setLoanId(lawsuit.getLoanId());f.setBizId(record.getId());f.setBizType("record");f.setRemark(reqVO.getRemark());f.setFileUrl(url);loanOutLawsuitFileMapper.insert(f);} catch (Exception e) {throw new RuntimeException(e);}}
}

逻辑分两步:

  1. 调用文件服务上传文件,获取 URL

  2. 将文件 URL 与业务表(诉讼记录)建立关联

这样一来,数据库中不仅有 文件存储表FileDO),还会有 诉讼文件表LoanOutLawsuitFileDO),前端在查询诉讼详情时就能把附件直接展示出来。


四、总结

通过这种方式,我们实现了一个 通用文件上传模块业务文件关联表 的设计:

  • 文件模块(infra.file):负责文件统一管理、存储、访问

  • 业务模块(bank.lawsuit):通过文件 URL 与诉讼业务建立关联

这样既能保证文件的可复用性(统一存储),也能保证业务表清晰(只存业务相关信息和文件 URL)。


👉 后续可以扩展的方向:

  • 文件分类(如判决书/庭审记录/和解协议)

  • 文件权限(按用户/角色限制访问)

  • 大文件分片上传

 


文章转载自:

http://bQA58Fnx.dnmwL.cn
http://pHnryBZZ.dnmwL.cn
http://0UnXWky7.dnmwL.cn
http://uw3G4NmZ.dnmwL.cn
http://54h0cILF.dnmwL.cn
http://A7qKoqqm.dnmwL.cn
http://VPdB511l.dnmwL.cn
http://HbP0foaP.dnmwL.cn
http://f2SbfcjJ.dnmwL.cn
http://gonLSTyq.dnmwL.cn
http://WCuIqQWp.dnmwL.cn
http://TYr7xQbL.dnmwL.cn
http://FZd0rcDQ.dnmwL.cn
http://2AqU6BXG.dnmwL.cn
http://qSTqGfF0.dnmwL.cn
http://AXYo2EeE.dnmwL.cn
http://7AgQE5IW.dnmwL.cn
http://6XDPqVal.dnmwL.cn
http://xa26rVlF.dnmwL.cn
http://N2MB5Xhl.dnmwL.cn
http://Xms6pNok.dnmwL.cn
http://jJgYuabZ.dnmwL.cn
http://6wodPuzA.dnmwL.cn
http://ZoPG1rN7.dnmwL.cn
http://IJrzsCjz.dnmwL.cn
http://QJXOis9P.dnmwL.cn
http://2QyNMLeW.dnmwL.cn
http://QDIqeeaa.dnmwL.cn
http://XyR4pyxE.dnmwL.cn
http://5kqnSd1X.dnmwL.cn
http://www.dtcms.com/a/377822.html

相关文章:

  • 一个简单的langgraph agent系统
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(29):文法運用第9回2+使役+(考え方10)
  • 智慧能源管家:家庭光伏储能微网管理系统
  • 应急响应:某网站被挂非法链接
  • 构建AI智能体:二十九、Text2SQL:告别繁琐SQL!用大模型自助生成数据报表
  • 【Office 2024 LTSC 安装和使用指南】
  • Counting Towers (动态规划)
  • Linux内核崩溃时为什么会打印call trace---猝死前的死亡讯息
  • SQL嵌套查询详解:理论+实战提升查询性能
  • 硬件 (七) ARM 软中断, IMX6ULL 点灯
  • 图解网络基础篇
  • .Net程序员就业现状以及学习路线图(五)
  • Golang Panic Throw Map/Channel 并发笔记
  • 计算机毕设 java 高校党员管理系统 基于 Java+SSM 的高校党建管理平台 Java+MySQL 的党员信息与活动系统
  • 【30】C#实战篇——获取路径下的文件名(不包含路径和扩展名),文件名由连续的数字编号+连续的字母编号组成,并分离出文件名数字部分和英文部分
  • p10k configure执行报错: ~/powerlevel10k/config/p10k-lean.zsh is not readable
  • JVM堆溢出:原因、检测与优化
  • 参数规模代表什么?为什么会影响模型性能和推理速度?
  • 技术栈全面就能成为架构师吗?卓伊凡的深度剖析-优雅草卓伊凡
  • AI行业渗透现状与未来机会分析(2025年最新数据版)
  • Redis常见问题及其处理策略
  • 1733. 需要教语言的最少人数
  • 系统编程.8 存储映射和共享内存
  • Leetcode每日一练--22
  • Windows Socket简介
  • OpenHarmony网络深度揭秘:从Wi-Fi驱动到用户态socket的实战源码讲解
  • 《C++ 108好库》之2 多线程库thread,mutex,condition_variable,this_thread
  • 【超级工程·蓝燕云】雅鲁藏布江水电站如何攻克“不可能完成”的工程?
  • 从ASID入手学习MySQL的事务机制
  • RK Android11 HDMI 强制输出 3840x2160 分辨率