跳到主要内容

文件、CDN 与传输记录

核验日期:2026-09-18。证据级别:当前源码静态核验 + 测试环境统一只读元数据采集。

物理类型、可空性、默认值、完整索引及约束见 MySQL 实测字典;源码与实库差异见 infra 总览。

文件元数据、实际内容、存储连接、CDN、分片任务和下载记录是六类不同对象。对象存储/FTP/本地磁盘中的文件本体不属于 MySQL 结构采集。

返回 infra 总览。以下列名为 MyBatis 映射或显式 SQL 预期,类型栏是 Java 类型,不推断数据库长度、默认值及可空性;所有 BaseDO 子类均包含总览所列五个继承字段。

业务流程与读写职责​

上传方调用 FileServiceImpl:98,服务选择存储配置、上传字节并写 infra_file,读取方通过文件 API 获取下载信息。大文件先由 FilePartUploadServiceImpl:128 建远程任务与分片记录,再获取分片 URL;completeUpload:213/219 更新任务并创建正式文件。分片任务 ID 与正式文件 ID 不能混用。下载重定向读取文件与配置,写独立下载记录追踪成功/失败和 Range。APK 包名/版本和摘要用于后续分发匹配,original_md5 服务日志原件压缩去重,业务目的不同。

Mermaid Diagram Code:

flowchart LR
  A[上传请求] --> B[文件存储配置]
  B --> C[外部存储或 DB 内容表]
  C --> D[infra_file 正式文件]
  E[分片上传任务] --> C
  E --> D
  F[CDN 配置] --> D
  D --> G[下载重定向]
  G --> H[下载请求记录]
  I[API 日志 file_ids] --> D

关系与存储规则​

  • infra_file.config_id → infra_file_config.id;特殊值 -1 表示外部链接。可选 cdn_config_id → infra_cdn_config.id,CDN 的 bind_config_id → infra_file_config.id 用于展示与校验。
  • infra_file_content 只供 DBFileClient;按 config_id + path 查询/删除(ik_project/yudao-cloud/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/FileContentMapper.java:13),不是所有文件都在此表保存二进制。
  • infra_file_part_upload.config_id/cdn_config_id 对应文件/CDN 配置;upload_id 是远程分片任务标识。此表状态流为 0 已生成、1 上传中、2 完成、3 失败,不能与下载状态混用。
  • infra_file_download_request.file_id → infra_file.id;0 成功、1 失败。该 DO 不继承 BaseDO,没有源码声明的 create_time、update_time、creator、updater、deleted。保留字 range 显式加反引号映射。
  • infra_file_config.config 经 FileClientConfigTypeHandler JSON 序列化,支持 DB/FTP/本地/SFTP/S3;原注释“支付渠道配置”与类型不符,业务含义应为文件客户端配置,不展示凭据内容。
  • infra_file.original_md5 是压缩前摘要;普通 md5 是文件摘要。FileMapper:19/29 可在明确恢复流程中读取软删除记录并保留原 ID 恢复,普通查询仍过滤 deleted。
  • 日志附件由 infra_api_access_log.file_ids 逻辑引用文件;FileServiceImpl:215/230 写入 ACCESS_LOG 分类。FileManagementAccessPolicy:30/38 控制文件管理可见性。分类枚举值与物理列容量必须另行对照,不能仅由 Java Integer 推断可容纳。

infra_file_config​

源码:ik_project/yudao-cloud/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileConfigDO.java:40。

继承:BaseDO(五个审计/软删除字段见下表末尾)。主键候选为 id(实体主键注解或 MyBatis 约定);二级索引、唯一性和物理外键以实际结构核对,不由字段名推定。

预期列名Java 属性 / 类型业务含义与映射源码行
idid: Long配置编号,数据库自增40
namename: String配置名44
storagestorage: Integer存储器 枚举 FileStorageEnum50
remarkremark: String备注54
mastermaster: Boolean是否为主配置 由于我们可以配置多个文件配置,默认情况下,使用主配置进行文件的上传60
enableenable: Integer是否开启 1-开启,0-关闭64
configconfig: FileClientConfig文件客户端配置;FileClientConfigTypeHandler JSON 序列化(源码注释误写为支付渠道)70
create_timecreateTime: LocalDateTime创建时间,INSERT 自动填充BaseDO:30
update_timeupdateTime: LocalDateTime修改时间,INSERT_UPDATE 自动填充BaseDO:35
creatorcreator: String创建者标识,VARCHAR 映射BaseDO:42
updaterupdater: String更新者标识,VARCHAR 映射BaseDO:49
deleteddeleted: Boolean逻辑删除字段BaseDO:54

infra_file_content​

源码:ik_project/yudao-cloud/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileContentDO.java:32。

继承:BaseDO(五个审计/软删除字段见下表末尾)。主键候选为 id(实体主键注解或 MyBatis 约定);二级索引、唯一性和物理外键以实际结构核对,不由字段名推定。

预期列名Java 属性 / 类型业务含义与映射源码行
idid: Long编号,数据库自增32
config_idconfigId: Long配置编号 关联 FileConfigDO#getId()38
pathpath: String路径,即文件名42
contentcontent: byte[]文件内容46
create_timecreateTime: LocalDateTime创建时间,INSERT 自动填充BaseDO:30
update_timeupdateTime: LocalDateTime修改时间,INSERT_UPDATE 自动填充BaseDO:35
creatorcreator: String创建者标识,VARCHAR 映射BaseDO:42
updaterupdater: String更新者标识,VARCHAR 映射BaseDO:49
deleteddeleted: Boolean逻辑删除字段BaseDO:54

infra_file​

源码:ik_project/yudao-cloud/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileDO.java:32。

继承:BaseDO(五个审计/软删除字段见下表末尾)。主键候选为 id(实体主键注解或 MyBatis 约定);二级索引、唯一性和物理外键以实际结构核对,不由字段名推定。

预期列名Java 属性 / 类型业务含义与映射源码行
idid: Long编号,数据库自增32
config_idconfigId: Long配置编号,-1表示外部链接 关联 FileConfigDO#getId()38
cdn_config_idcdnConfigId: LongCDN 配置编号,关联 infra_cdn_config.id;为空表示未启用 CDN42
namename: String原文件名46
pathpath: String路径,即文件名50
urlurl: String访问地址54
typetype: String文件的 MIME 类型,例如 "application/octet-stream" 对应旧系统的mimeType59
sizesize: Integer文件大小63
classificationclassification: Integer文件分类 枚举 DictFileClassificationEnum69
redirect_urlredirectUrl: String真实下载地址(如果进入重定向的话返回该地址)73
remarkremark: String备注77
package_namepackageName: String冗余apk包名,非apk文件不填,用于解析apk时存储apk数据81
version_codeversionCode: Long冗余apk版本号,非apk文件不填,用于解析apk时存储apk数据85
version_nameversionName: String冗余apk版本名,非apk文件不填,用于解析apk时存储apk数据89
md5md5: String文件的 MD594
original_md5originalMd5: String压缩前原始字节的 MD5,用于原件去重;通用文件属性,不包含日志或业务归属。96
create_timecreateTime: LocalDateTime创建时间,INSERT 自动填充BaseDO:30
update_timeupdateTime: LocalDateTime修改时间,INSERT_UPDATE 自动填充BaseDO:35
creatorcreator: String创建者标识,VARCHAR 映射BaseDO:42
updaterupdater: String更新者标识,VARCHAR 映射BaseDO:49
deleteddeleted: Boolean逻辑删除字段BaseDO:54

infra_file_download_request​

源码:ik_project/yudao-cloud/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileDownloadRequestDO.java:27。

继承:无 BaseDO 继承。主键候选为 id(实体主键注解或 MyBatis 约定);二级索引、唯一性和物理外键以实际结构核对,不由字段名推定。

预期列名Java 属性 / 类型业务含义与映射源码行
idid: Integer主键27
ipip: String设备端IP31
request_timerequestTime: LocalDateTime请求时间35
file_idfileId: Long文件资源ID39
bytes_startbytesStart: Integer断点续传开始点43
bytes_endbytesEnd: Integer断点续传结束点47
bytes_lengthbytesLength: Integer总文件大小51
urlurl: String原始下载地址55
redirect_urlredirectUrl: String重定向下载地址60
fail_reasonfailReason: String失败原因64
statusstatus: Integer状态,0-成功,1-失败 枚举 file_download_status 对应的类70
rangerange: String下载请求 Range 头73

infra_cdn_config​

源码:ik_project/yudao-cloud/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/InfraCdnConfigDO.java:29。

继承:BaseDO(五个审计/软删除字段见下表末尾)。主键候选为 id(实体主键注解或 MyBatis 约定);二级索引、唯一性和物理外键以实际结构核对,不由字段名推定。

预期列名Java 属性 / 类型业务含义与映射源码行
idid: Long配置编号29
namename: String配置名33
vendorvendor: IntegerCDN 厂商:1-AWS CloudFront;预留 2-Aliyun,3-Tencent,4-Cloudflare 枚举 cdn_vendor 对应的类39
domaindomain: StringCD域N 加速名(不含 scheme),如 d111111.cloudfront.net 或自定义域名43
schemescheme: String协议:http/https47
path_prefixpathPrefix: String路径前缀,可空;最终 URL = scheme://domain/path_prefix/{file.path}51
bind_config_idbindConfigId: Long绑定的源站文件配置(infra_file_config.id),仅展示与校验用,可空55
distribution_iddistributionId: String【预留】CloudFront 分发 ID,后续刷新缓存功能使用59
extra_configextraConfig: String厂商扩展 JSON,后续如需鉴权/签名在这里扩展63
enableenable: Integer是否启用:1-开启 0-关闭67
remarkremark: String备注71
create_timecreateTime: LocalDateTime创建时间,INSERT 自动填充BaseDO:30
update_timeupdateTime: LocalDateTime修改时间,INSERT_UPDATE 自动填充BaseDO:35
creatorcreator: String创建者标识,VARCHAR 映射BaseDO:42
updaterupdater: String更新者标识,VARCHAR 映射BaseDO:49
deleteddeleted: Boolean逻辑删除字段BaseDO:54

infra_file_part_upload​

源码:ik_project/yudao-cloud/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/filepart/FilePartUploadDO.java:30。

继承:BaseDO(五个审计/软删除字段见下表末尾)。主键候选为 id(实体主键注解或 MyBatis 约定);二级索引、唯一性和物理外键以实际结构核对,不由字段名推定。

预期列名Java 属性 / 类型业务含义与映射源码行
idid: Long主键,自增长30
upload_iduploadId: String上传任务ID34
file_urlfileUrl: String文件下载url38
config_idconfigId: Long配置编号42
cdn_config_idcdnConfigId: LongCDN 配置编号46
file_keyfileKey: String文件key50
statusstatus: Integer状态,0-已生成任务,1-上传中,2-上传完成,3-上传失败 枚举 file_part_upload_status 对应的类56
check_resultcheckResult: String远程校验结果(文字描述)61
redirect_urlredirectUrl: String真实下载地址(如果进入重定向的话返回该地址)66
namename: String原文件名70
typetype: String文件的 MIME 类型,例如 "application/octet-stream" 对应旧系统的mimeType75
sizesize: Integer文件大小80
classificationclassification: Integer文件分类 枚举 DictFileClassificationEnum86
remarkremark: String备注91
package_namepackageName: String冗余apk包名,非apk文件不填,用于解析apk时存储apk数据95
version_codeversionCode: Long冗余apk版本号,非apk文件不填,用于解析apk时存储apk数据99
version_nameversionName: String冗余apk版本名,非apk文件不填,用于解析apk时存储apk数据103
md5md5: String文件的 MD5108
create_timecreateTime: LocalDateTime创建时间,INSERT 自动填充BaseDO:30
update_timeupdateTime: LocalDateTime修改时间,INSERT_UPDATE 自动填充BaseDO:35
creatorcreator: String创建者标识,VARCHAR 映射BaseDO:42
updaterupdater: String更新者标识,VARCHAR 映射BaseDO:49
deleteddeleted: Boolean逻辑删除字段BaseDO:54

本次实测对照​

  • infra_file_config:13 列,源码字段全部存在;额外物理列 cdn_config。索引:PRIMARY(id) 唯一。物理外键:本次元数据未返回。
  • infra_file_content:9 列,源码字段全部存在,无额外物理列。索引:PRIMARY(id) 唯一。物理外键:本次元数据未返回。
  • infra_file:21 列,源码字段全部存在,无额外物理列。索引:idx_cdn_config_id(cdn_config_id);idx_original_md5(original_md5);PRIMARY(id) 唯一。物理外键:本次元数据未返回。
  • infra_file_download_request:12 列,源码字段全部存在,无额外物理列。索引:file_id(file_id);ip(ip);PRIMARY(id) 唯一。物理外键:本次元数据未返回。
  • infra_cdn_config:17 列,源码字段全部存在;额外物理列 tenant_id。索引:idx_enable(enable);idx_vendor(vendor);PRIMARY(id) 唯一。物理外键:本次元数据未返回。
  • infra_file_part_upload:24 列,源码字段全部存在;额外物理列 tenant_id。索引:idx_cdn_config_id(cdn_config_id);PRIMARY(id) 唯一。物理外键:本次元数据未返回。

infra_file.classification 本次实测为 int,original_md5 为可空 char(32) 且有 idx_original_md5,不能沿用历史 tinyint 结论。infra_file_config.cdn_config 是额外物理列,当前 FileConfigDO 未映射,当前 CDN 设计见独立 infra_cdn_config 及 file.cdn_config_id。

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答