Files
v-hono/docs/README_DATABASE.md

166 lines
3.5 KiB
Markdown

# V-Hono 文件上传系统 - 数据库集成
## 概述
V-Hono 文件上传系统现在集成了 SQLite 数据库来管理文件信息,支持文件去重、版本管理和元数据存储。
## 新功能
### 1. 文件路径格式更新
合并后的文件现在使用新的命名格式:
```
./uploads/files/{filehash}.{filetype}
```
例如:
- `./uploads/files/a1b2c3d4e5f6.txt`
- `./uploads/files/1234567890abcdef.jpg`
### 2. 数据库表结构
```sql
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 端点
#### 获取所有文件信息
```http
GET /api/files
```
#### 根据文件UUID获取文件信息
```http
GET /api/files/{uuid}
```
#### 根据文件hash获取文件信息
```http
GET /api/files/hash/{hash}
```
#### 删除文件信息
```http
DELETE /api/files/{uuid}
```
## 配置
在 `ChunkUploadConfig` 中添加了数据库配置:
```v
pub struct ChunkUploadConfig {
// ... 其他配置
db_path string = './uploads/files.db' // 数据库文件路径
}
```
## 使用示例
### 1. 启动服务器
```bash
v run chunk_upload_example.v
```
### 2. 测试数据库功能
```bash
v run test_database.v
```
### 3. 上传文件
文件上传完成后,系统会:
1. 将文件保存为 `{filehash}.{filetype}` 格式
2. 在数据库中记录文件信息
3. 返回文件UUID
### 4. 查询文件信息
```bash
# 获取所有文件
curl http://localhost:8080/api/files
# 根据UUID获取文件信息
curl http://localhost:8080/api/files/{uuid}
# 根据hash获取文件信息
curl http://localhost:8080/api/files/hash/{hash}
```
## 数据库操作
### 插入或更新文件信息
```v
file_info := db.insert_or_update_file(file_hash, file_name, file_size, file_type)
```
### 查询文件信息
```v
// 根据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()
```
### 删除文件信息
```v
db.delete_file(file_uuid)
```
## 依赖
项目现在依赖 `vlang/sqlite` 模块:
```v
// 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. 数据库操作失败不会影响文件上传功能