Files
v-hono/docs/README_DATABASE.md

3.5 KiB

V-Hono 文件上传系统 - 数据库集成

概述

V-Hono 文件上传系统现在集成了 SQLite 数据库来管理文件信息,支持文件去重、版本管理和元数据存储。

新功能

1. 文件路径格式更新

合并后的文件现在使用新的命名格式:

./uploads/files/{filehash}.{filetype}

例如:

  • ./uploads/files/a1b2c3d4e5f6.txt
  • ./uploads/files/1234567890abcdef.jpg

2. 数据库表结构

CREATE TABLE file_info (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    file_uuid TEXT UNIQUE NOT NULL,      -- 文件唯一标识符
    file_hash TEXT NOT NULL,             -- 文件哈希值
    file_name TEXT NOT NULL,             -- 原始文件名
    file_size INTEGER NOT NULL,          -- 文件大小
    file_type TEXT NOT NULL,             -- 文件扩展名
    created_at INTEGER NOT NULL,         -- 创建时间
    updated_at INTEGER NOT NULL          -- 更新时间
);

3. 文件去重逻辑

  • 相同 hash + 相同文件名:更新现有记录
  • 相同 hash + 不同文件名:创建新记录(支持同一文件的不同名称)
  • 不同 hash:创建新记录

4. 新增 API 端点

获取所有文件信息

GET /api/files

根据文件UUID获取文件信息

GET /api/files/{uuid}

根据文件hash获取文件信息

GET /api/files/hash/{hash}

删除文件信息

DELETE /api/files/{uuid}

配置

在 ChunkUploadConfig 中添加了数据库配置:

pub struct ChunkUploadConfig {
    // ... 其他配置
    db_path string = './uploads/files.db'  // 数据库文件路径
}

使用示例

1. 启动服务器

v run chunk_upload_example.v

2. 测试数据库功能

v run test_database.v

3. 上传文件

文件上传完成后,系统会:

  1. 将文件保存为 {filehash}.{filetype} 格式
  2. 在数据库中记录文件信息
  3. 返回文件UUID

4. 查询文件信息

# 获取所有文件
curl http://localhost:8080/api/files

# 根据UUID获取文件信息
curl http://localhost:8080/api/files/{uuid}

# 根据hash获取文件信息
curl http://localhost:8080/api/files/hash/{hash}

数据库操作

插入或更新文件信息

file_info := db.insert_or_update_file(file_hash, file_name, file_size, file_type)

查询文件信息

// 根据hash查询
file_info := db.get_file_by_hash(file_hash)

// 根据UUID查询
file_info := db.get_file_by_uuid(file_uuid)

// 获取所有文件
files := db.get_all_files()

删除文件信息

db.delete_file(file_uuid)

依赖

项目现在依赖 vlang/sqlite 模块:

// v.mod
dependencies: ['vlang/sqlite']

文件结构

v-hono/
├── hono/
│   ├── database.v          # 数据库管理模块
│   ├── upload.v            # 上传模块(已更新)
│   └── ...
├── chunk_upload_example.v  # 示例应用(已更新)
├── test_database.v         # 数据库测试
└── uploads/
    ├── files/              # 最终文件目录
    ├── chunks/             # 分片文件目录
    └── files.db            # SQLite数据库文件

注意事项

  1. 数据库文件会自动创建在 uploads/ 目录下
  2. 文件去重基于文件hash,支持同一文件的不同名称
  3. 每个文件都有唯一的UUID,用于API访问
  4. 文件路径使用hash命名,避免文件名冲突
  5. 数据库操作失败不会影响文件上传功能