文件上传数据表

在这个指南中,我们将详细介绍如何设计和实现一个文件上传和管理系统的数据库

1. 文件表设计

首先,我们需要设计一个表来存储上传文件的相关信息。以下是一个示例的 SQL 表结构:

CREATE TABLE tio_boot_admin_system_upload_file (
  id BIGINT NOT NULL, -- 文件ID
  md5 VARCHAR(32) NOT NULL, -- 文件的MD5值,用于校验文件一致性
  filename VARCHAR(64) NOT NULL, -- 文件名
  file_size BIGINT NOT NULL, -- 文件大小,单位为字节
  user_id VARCHAR(32), -- 用户ID,标识上传文件的用户
  platform VARCHAR(64) NOT NULL, -- 上传平台(如S3)
  region_name VARCHAR(32), -- 区域名
  bucket_name VARCHAR(64) NOT NULL, -- 存储桶名称
  file_id VARCHAR(64) NOT NULL, -- 文件存储ID
  target_name VARCHAR(64) NOT NULL, -- 文件存储路径
  tags JSON, -- 文件标签,使用JSON格式
  creator VARCHAR(64) DEFAULT '', -- 创建者
  create_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
  updater VARCHAR(64) DEFAULT '', -- 更新者
  update_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 更新时间
  deleted SMALLINT NOT NULL DEFAULT 0, -- 删除标志
  tenant_id BIGINT NOT NULL DEFAULT 0, -- 租户ID
  PRIMARY KEY (id) -- 主键
);

插入示例数据:

INSERT INTO tio_boot_admin_system_upload_file (
  id, md5, filename, file_size, user_id, platform, bucket_name, file_id, target_name, tags, creator, create_time, updater, update_time, deleted, tenant_id
) VALUES (
  1, -- 文件ID
  'd41d8cd98f00b204e9800998ecf8427e', -- MD5值
  'example.txt', -- 文件名
  1024, -- 文件大小
  'user123', -- 用户ID
  's3', -- 平台
  'sd', -- 存储桶名称
  '367962274737995776', -- 文件存储ID
  'public/images/367962274737995776.png', -- 文件存储路径
  '{"genre": "text", "language": "English"}', -- 标签,JSON格式
  'admin', -- 创建者
  CURRENT_TIMESTAMP, -- 创建时间
  'admin', -- 更新者
  CURRENT_TIMESTAMP, -- 更新时间
  0, -- 删除标志
  100 -- 租户ID
);

该表记录了文件的基本信息和元数据,如文件的 MD5 值、文件名、文件大小、存储路径和标签等。

2. 业务表设计

业务表用于存储与业务相关的信息,同时记录与文件关联的数据。以下是业务表的示例:

CREATE TABLE rprofessors (
  id BIGINT NOT NULL, -- 教授ID
  name VARCHAR(256), -- 教授姓名
  department VARCHAR(256), -- 所属部门
  email VARCHAR(256), -- 邮箱
  description TEXT, -- 描述
  files JSON, -- 文件信息,JSON格式
  remark VARCHAR(256), -- 备注
  creator VARCHAR(64) DEFAULT '', -- 创建者
  create_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
  updater VARCHAR(64) DEFAULT '', -- 更新者
  update_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 更新时间
  deleted SMALLINT DEFAULT 0, -- 删除标志
  tenant_id BIGINT NOT NULL DEFAULT 0, -- 租户ID
  PRIMARY KEY (id) -- 主键
);

文件字段的示例数据如下:

[
  {
    "uid": "1719137636702",
    "name": "image.png",
    "status": "done",
    "size": 424869,
    "type": "image/png",
    "id": "394523104107352064",
    "url": "https://rumiapp.s3.us-west-1.amazonaws.com/sjsj/professors/394523099162267648.png"
  },
  {
    "uid": "1719137646121",
    "name": "image.png",
    "status": "done",
    "size": 424869,
    "type": "image/png",
    "id": "394523144213319680",
    "url": "https://rumiapp.s3.us-west-1.amazonaws.com/sjsj/professors/394523138647478272.png"
  }
]

3. 上传场景业务逻辑描述

1. 检查文件是否已存在

前端生成文件的 MD5 值,通过后端的 URL 接口判断对应的文件是否存在。如果文件存在,返回如下数据:

GET /api/system/file/s3/url?md5=c9fa90c0e145f2d62560f5431b271326

响应示例:

{
  "code": 1,
  "data": {
    "id": 394519014493130752,
    "url": "https://rumiapp.s3.us-west-1.amazonaws.com/public%2Fimages%2F394519008180703232.png"
  },
  "ok": true
}

2. 上传文件

如果文件不存在,前端调用上传接口上传文件,后端同时将文件信息存入文件表。上传完成后,返回包含文件信息的 id 和 url。

3. 提交业务数据

前端在完成业务数据录入后,将包含文件字段的数据提交到后端。请求示例如下:

POST /table/rumi_uc_berkeley_professors/create
{
  "name": "Tong Li",
  "其他业务字段": "其他值",
  "files": [
    {
      "uid": "1719430104206",
      "name": "image.png",
      "status": "done",
      "size": 424869,
      "type": "image/png",
      "id": 394519014493130750,
      "url": "https://rumiapp.s3.us-west-1.amazonaws.com/public%2Fimages%2F394519008180703232.png"
    }
  ]
}

通过上述步骤,您可以轻松实现一个文件上传和管理系统的数据库设计,并确保数据的完整性和一致性。