# 文件存储系统 ## 概述 本存储系统采用策略模式设计,支持多种存储后端,包括本地存储和各大云服务商的对象存储服务。 ## 支持的存储类型 - **本地存储 (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` - 文件操作失败时会抛出相应异常