文件存储
Doggy 文件存储系统基于 League Flysystem 构建,支持本地存储和 S3 兼容存储,提供文件上传、图片优化、URL 生成等能力。
概述
存储系统位于 src/Service/Storage/:
src/Service/Storage/
├── StorageManager.php # 存储管理器(适配器选择)
├── FileUploadService.php # 文件上传服务
├── FileUrlGenerator.php # URL 生成/缓存
├── ImageOptimizerService.php # 图片优化(Imagine 库)
└── Adapter/
├── StorageAdapterInterface.php
├── LocalStorageAdapter.php
└── S3StorageAdapter.php相关实体在 src/Entity/Storage/:
| 实体 | 说明 |
|---|---|
File.php | 文件记录 |
StorageConfig.php | 存储配置(适配器类型、参数、CDN 域名) |
UploadSession.php | 上传会话 |
存储后端
| 后端 | 适配器 | 适用场景 |
|---|---|---|
| Local | LocalStorageAdapter | 开发环境、小规模部署 |
| AWS S3 | S3StorageAdapter | 云部署(支持 CDN 域名) |
本地存储
php
// 默认本地存储:public/uploads/
$adapter = new LocalStorageAdapter(
rootPath: '/var/www/public/uploads',
publicUrl: '/uploads'
);S3 存储
php
// S3 兼容存储(支持 AWS、MinIO、阿里云 OSS 等)
$adapter = new S3StorageAdapter([
'access_key' => '...',
'secret_key' => '...',
'region' => 'us-east-1',
'bucket' => 'doggy-files',
'endpoint' => 'https://oss-cn-hangzhou.aliyuncs.com',
'cdn_domain' => 'https://cdn.example.com',
]);文件上传
FileUploadService 提供完整的上传流程:
php
$file = $fileUploadService->upload($uploadedFile, [
'disk' => 'default',
'optimize' => true,
'max_size' => 52428800, // 50MB
]);上传流程:
FileUploadingEvent调度(可拦截修改选项)- 文件安全检查(类型、大小、扩展名、MIME)
- SHA-256 哈希去重
- 按日期策略生成存储路径(
Y/m/uuid.ext或uuid.ext) - 上传到适配器
- 创建 File 实体
FileUploadedEvent调度- 异步图片压缩消息(
ImageCompressMessage)
图片优化
ImageOptimizerService 基于 Imagine 库:
php
$optimizer->optimize($sourcePath, $targetPath, [
'max_width' => 1920,
'max_height' => 1080,
'quality' => 80,
'format' => 'webp',
]);URL 生成
FileUrlGenerator 支持缓存和临时 URL:
php
$url = $urlGenerator->getUrl($file); // 带缓存
$tempUrl = $urlGenerator->getTemporaryUrl($file, $expiresAt); // 签名 URL
$urlGenerator->invalidateUrl($file); // 清除缓存管理界面
入口:App\Controller\Admin\StorageConfigController
模板:templates/admin/storage/