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.ext または uuid.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