文件、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 服务日志原件压缩去重,业务目的不同。
关系与存储规则
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 属性 / 类型 | 业务含义与映射 | 源码行 |
|---|---|---|---|
id | id: Long | 配置编号,数据库自增 | 40 |
name | name: String | 配置名 | 44 |
storage | storage: Integer | 存储器 枚举 FileStorageEnum | 50 |
remark | remark: String | 备注 | 54 |
master | master: Boolean | 是否为主配置 由于我们可以配置多个文件配置,默认情况下,使用主配置进行文件的上传 | 60 |
enable | enable: Integer | 是否开启 1-开启,0-关闭 | 64 |
config | config: FileClientConfig | 文件客户端配置;FileClientConfigTypeHandler JSON 序列化(源码注释误写为支付渠道) | 70 |
create_time | createTime: LocalDateTime | 创建时间,INSERT 自动填充 | BaseDO:30 |
update_time | updateTime: LocalDateTime | 修改时间,INSERT_UPDATE 自动填充 | BaseDO:35 |
creator | creator: String | 创建者标识,VARCHAR 映射 | BaseDO:42 |
updater | updater: String | 更新者标识,VARCHAR 映射 | BaseDO:49 |
deleted | deleted: 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 属性 / 类型 | 业务含义与映射 | 源码行 |
|---|---|---|---|
id | id: Long | 编号,数据库自增 | 32 |
config_id | configId: Long | 配置编号 关联 FileConfigDO#getId() | 38 |
path | path: String | 路径,即文件名 | 42 |
content | content: byte[] | 文件内容 | 46 |
create_time | createTime: LocalDateTime | 创建时间,INSERT 自动填充 | BaseDO:30 |
update_time | updateTime: LocalDateTime | 修改时间,INSERT_UPDATE 自动填充 | BaseDO:35 |
creator | creator: String | 创 建者标识,VARCHAR 映射 | BaseDO:42 |
updater | updater: String | 更新者标识,VARCHAR 映射 | BaseDO:49 |
deleted | deleted: 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 属性 / 类型 | 业务含义与映射 | 源码行 |
|---|---|---|---|
id | id: Long | 编号,数据库自增 | 32 |
config_id | configId: Long | 配置编号,-1表示外部链接 关联 FileConfigDO#getId() | 38 |
cdn_config_id | cdnConfigId: Long | CDN 配置编号,关联 infra_cdn_config.id;为空表示未启用 CDN | 42 |
name | name: String | 原文件名 | 46 |
path | path: String | 路径,即文件名 | 50 |
url | url: String | 访问地址 | 54 |
type | type: String | 文件的 MIME 类型,例如 "application/octet-stream" 对应旧系统的mimeType | 59 |
size | size: Integer | 文件大小 | 63 |
classification | classification: Integer | 文件分类 枚举 DictFileClassificationEnum | 69 |
redirect_url | redirectUrl: String | 真实下载地址(如果进入重定向的话返回该地址) | 73 |
remark | remark: String | 备注 | 77 |
package_name | packageName: String | 冗余apk包名,非apk文件不填,用于解析apk时存储apk数据 | 81 |
version_code | versionCode: Long | 冗余apk版本号,非apk文件不填,用于解析apk时存储apk数据 | 85 |
version_name | versionName: String | 冗余apk版本名,非apk文件不填,用于解析apk时存储apk数据 | 89 |
md5 | md5: String | 文件的 MD5 | 94 |
original_md5 | originalMd5: String | 压缩前原始字节的 MD5,用于原件去重;通用文件属性,不包含日志或业务归属。 | 96 |
create_time | createTime: LocalDateTime | 创建时间,INSERT 自动填充 | BaseDO:30 |
update_time | updateTime: LocalDateTime | 修改时间,INSERT_UPDATE 自动填充 | BaseDO:35 |
creator | creator: String | 创建者标识,VARCHAR 映射 | BaseDO:42 |
updater | updater: String | 更新者标识,VARCHAR 映射 | BaseDO:49 |
deleted | deleted: 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 属性 / 类型 | 业务含义与映射 | 源码行 |
|---|---|---|---|
id | id: Integer | 主键 | 27 |
ip | ip: String | 设备端IP | 31 |
request_time | requestTime: LocalDateTime | 请求时间 | 35 |
file_id | fileId: Long | 文件资源ID | 39 |
bytes_start | bytesStart: Integer | 断点续传开始点 | 43 |
bytes_end | bytesEnd: Integer | 断点续传结束点 | 47 |
bytes_length | bytesLength: Integer | 总文件大小 | 51 |
url | url: String | 原始下载地址 | 55 |
redirect_url | redirectUrl: String | 重定向下载地址 | 60 |
fail_reason | failReason: String | 失败原因 | 64 |
status | status: Integer | 状态,0-成功,1-失败 枚举 file_download_status 对应的类 | 70 |
range | range: 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 属性 / 类型 | 业务含义与映射 | 源码行 |
|---|---|---|---|
id | id: Long | 配置编号 | 29 |
name | name: String | 配置名 | 33 |
vendor | vendor: Integer | CDN 厂商:1-AWS CloudFront;预留 2-Aliyun,3-Tencent,4-Cloudflare 枚举 cdn_vendor 对应的类 | 39 |
domain | domain: String | CD域N 加速名(不含 scheme),如 d111111.cloudfront.net 或自定义域名 | 43 |
scheme | scheme: String | 协议:http/https | 47 |
path_prefix | pathPrefix: String | 路径前缀,可空;最终 URL = scheme://domain/path_prefix/{file.path} | 51 |
bind_config_id | bindConfigId: Long | 绑定的源站文件配置(infra_file_config.id),仅展示与校验用,可空 | 55 |
distribution_id | distributionId: String | 【预留】CloudFront 分发 ID,后续刷新缓存功能使用 | 59 |
extra_config | extraConfig: String | 厂商扩展 JSON,后续如需鉴权/签名在这里扩展 | 63 |
enable | enable: Integer | 是否启用:1-开启 0-关闭 | 67 |
remark | remark: String | 备注 | 71 |
create_time | createTime: LocalDateTime | 创建时间,INSERT 自动填充 | BaseDO:30 |
update_time | updateTime: LocalDateTime | 修改时间,INSERT_UPDATE 自动填充 | BaseDO:35 |
creator | creator: String | 创建者标识,VARCHAR 映射 | BaseDO:42 |
updater | updater: String | 更新者标识,VARCHAR 映射 | BaseDO:49 |
deleted | deleted: 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 属性 / 类型 | 业务含义与映射 | 源码行 |
|---|---|---|---|
id | id: Long | 主键,自增长 | 30 |
upload_id | uploadId: String | 上传任务ID | 34 |
file_url | fileUrl: String | 文件下载url | 38 |
config_id | configId: Long | 配置编号 | 42 |
cdn_config_id | cdnConfigId: Long | CDN 配置编号 | 46 |
file_key | fileKey: String | 文件key | 50 |
status | status: Integer | 状态,0-已生成任务,1-上传中,2-上传完成,3-上传失败 枚举 file_part_upload_status 对应的类 | 56 |
check_result | checkResult: String | 远程校验结果(文字描述) | 61 |
redirect_url | redirectUrl: String | 真实下载地址(如果进入重定向的话返回该地址) | 66 |
name | name: String | 原文件名 | 70 |
type | type: String | 文件的 MIME 类型,例如 "application/octet-stream" 对应旧系统的mimeType | 75 |
size | size: Integer | 文件大小 | 80 |
classification | classification: Integer | 文件分类 枚举 DictFileClassificationEnum | 86 |
remark | remark: String | 备注 | 91 |
package_name | packageName: String | 冗余apk包名,非apk文件不填,用于解析apk时存储apk数据 | 95 |
version_code | versionCode: Long | 冗余apk版本号,非apk文件不填,用于解析apk时存储apk数据 | 99 |
version_name | versionName: String | 冗余apk版本名,非apk文件不填,用于解析apk时存储apk数据 | 103 |
md5 | md5: String | 文件的 MD5 | 108 |
create_time | createTime: LocalDateTime | 创建时间,INSERT 自动填充 | BaseDO:30 |
update_time | updateTime: LocalDateTime | 修改时间,INSERT_UPDATE 自动填充 | BaseDO:35 |
creator | creator: String | 创建者标识,VARCHAR 映射 | BaseDO:42 |
updater | updater: String | 更新者标识,VARCHAR 映射 | BaseDO:49 |
deleted | deleted: 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。