You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iTi-Flask/iti/applications/common/storage/README.md

155 lines
3.6 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 文件存储系统
## 概述
本存储系统采用策略模式设计,支持多种存储后端,包括本地存储和各大云服务商的对象存储服务。
## 支持的存储类型
- **本地存储 (local)** - 默认,无需额外依赖
- **阿里云OSS (aliyun_oss)** - 需要安装 `oss2`
- **腾讯云COS (tencent_cos)** - 需要安装 `cos-python-sdk-v5`
- **七牛云Kodo (qiniu_kodo)** - 需要安装 `qiniu`
- **华为云OBS (huawei_obs)** - 需要安装 `esdk-obs-python`
- **AWS S3 (aws_s3)** - 待实现
- **MinIO (minio)** - 待实现
## 安装依赖
根据需要安装对应的SDK
```bash
# 阿里云OSS
pip install oss2
# 腾讯云COS
pip install cos-python-sdk-v5
# 七牛云Kodo
pip install qiniu
# 华为云OBS
pip install esdk-obs-python
```
或一次性安装所有依赖:
```bash
pip install oss2 cos-python-sdk-v5 qiniu esdk-obs-python
```
## 配置说明
### 环境变量配置
`.env` 文件中配置对应的云存储凭证:
```bash
# 阿里云OSS
ALIYUN_OSS_ACCESS_KEY_ID=your_access_key_id
ALIYUN_OSS_ACCESS_KEY_SECRET=your_access_key_secret
ALIYUN_OSS_ENDPOINT=oss-cn-hangzhou.aliyuncs.com
ALIYUN_OSS_BUCKET=your_bucket_name
# 腾讯云COS
TENCENT_COS_SECRET_ID=your_secret_id
TENCENT_COS_SECRET_KEY=your_secret_key
TENCENT_COS_REGION=ap-guangzhou
TENCENT_COS_BUCKET=your_bucket_name
# 七牛云Kodo
QINIU_KODO_ACCESS_KEY=your_access_key
QINIU_KODO_SECRET_KEY=your_secret_key
QINIU_KODO_BUCKET=your_bucket_name
QINIU_KODO_DOMAIN=your_cdn_domain.com
# 华为云OBS
HUAWEI_OBS_ACCESS_KEY_ID=your_access_key_id
HUAWEI_OBS_SECRET_ACCESS_KEY=your_secret_access_key
HUAWEI_OBS_SERVER=obs.cn-north-4.myhuaweicloud.com
HUAWEI_OBS_BUCKET=your_bucket_name
```
### 应用配置
`config.py` 中修改默认存储类型:
```python
FILE_STORAGE = {
"DEFAULT_STORAGE_TYPE": "aliyun_oss", # 修改为你想要的默认存储
"LOCAL": {
"base_path": "/path/to/uploads",
},
"ALIYUN_OSS": {
# ...
},
}
```
## 使用方式
### 1. 全局默认存储
在配置文件中设置 `DEFAULT_STORAGE_TYPE`,所有未指定存储类型的文件将使用此存储。
### 2. 目录级存储
为特定目录设置 `default_storage_type`
```python
directory = SysFileDirectory(
name="用户头像",
path="/avatars",
default_storage_type="aliyun_oss" # 该目录下的文件使用阿里云OSS
)
```
### 3. 请求级存储
上传文件时通过参数指定:
```javascript
// 普通上传
formData.append('storageType', 'tencent_cos');
// TUS上传
uppy.setMeta({
storageType: 'qiniu_kodo'
});
```
## 存储优先级
请求参数 > 目录默认 > 全局默认
## 接口说明
所有存储适配器实现了统一的 `StorageInterface` 接口:
- `upload()` - 上传文件
- `append_chunk()` - 追加数据块用于TUS协议
- `download()` - 下载文件
- `delete()` - 删除文件
- `exists()` - 检查文件是否存在
- `get_url()` - 获取访问URL支持签名URL
## 注意事项
1. **TUS协议支持**
- 阿里云OSS、华为云OBS 支持原生追加写入
- 腾讯云COS、七牛云Kodo 使用读-改-写策略模拟追加(性能较低,不建议用于大文件)
2. **URL签名**
- 所有云存储都支持生成带签名的临时URL
- 设置 `expires=0` 可生成永久URL仅适用于公共读bucket
3. **秒传机制**
- 系统会检查文件哈希,相同存储类型下的重复文件自动复用
- 不同存储类型的相同文件会分别存储
4. **错误处理**
- SDK未安装时会抛出 `ImportError`
- 配置不完整时会抛出 `ValueError`
- 文件操作失败时会抛出相应异常