Skip to content

文件存储

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上传会话

存储后端

后端适配器适用场景
LocalLocalStorageAdapter开发环境、小规模部署
AWS S3S3StorageAdapter云部署(支持 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
]);

上传流程:

  1. FileUploadingEvent 调度(可拦截修改选项)
  2. 文件安全检查(类型、大小、扩展名、MIME)
  3. SHA-256 哈希去重
  4. 按日期策略生成存储路径(Y/m/uuid.extuuid.ext
  5. 上传到适配器
  6. 创建 File 实体
  7. FileUploadedEvent 调度
  8. 异步图片压缩消息(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/

基于 MIT 协议开源 | Copyright © 2026 Doggy