# Kylin Media

Kylin 媒体文件管理包 — Fork 自 spatie/laravel-medialibrary，增加合规与安全增强。

## 功能特性

### 媒体管理
- **媒体关联**：Eloquent 模型关联媒体文件（`HasMedia` Trait）
- **多集合**：一个模型可关联多个媒体集合（头像、附件等）
- **图片处理**：自动生成缩略图、裁剪
- **文件转换**：格式转换、尺寸调整
- **响应式图片**：生成多种尺寸的 srcset
- **ZIP 下载**：批量下载媒体文件

### 安全合规
- **恶意文件过滤**：禁止上传可执行文件、脚本文件（`disallowed_extensions` 黑名单）
- **文件大小限制**：`max_file_size = 10MB`，防止存储滥用
- **MIME 校验**：文件类型白名单
- **EXIF 元数据剥离**：`--strip-all` 去除所有文本信息，保护隐私
- **图片优化**：JPEG 85% 质量 + 渐进式编码
- **多存储驱动**：S3 / 本地存储

## 安装

```bash
composer require kylin/media
```

## 配置发布

```bash
php artisan vendor:publish --tag=kylin-media-config
```

## 使用示例

### 媒体关联

```php
use Kylin\Media\HasMedia;

class User extends Model
{
    use HasMedia;

    public function registerMediaCollections(): void
    {
        $this->addMediaCollection('avatar')
            ->singleFile()
            ->acceptsMimeTypes(['image/jpeg', 'image/png']);

        $this->addMediaCollection('documents');
    }
}

// 添加媒体
$user->addMedia($file)->toMediaCollection('avatar');

// 获取媒体 URL
$user->getFirstMediaUrl('avatar');

// 生成缩略图
$user->getFirstMediaUrl('avatar', 'thumb');
```

### 安全配置

```php
// config/kylin-media.php
'disallowed_extensions' => [
    'php', 'exe', 'sh', 'bat', 'js', 'py', 'phtml', 'phar',
    'jsp', 'asp', 'aspx', 'cgi', 'pl',
],
'max_file_size' => 10 * 1024 * 1024, // 10MB
'image_optimization' => [
    'jpeg_quality' => 85,
    'progressive' => true,
    'strip_exif' => true,  // 剥离 EXIF/GPS 信息
],
```

## 法律合规

本包严格遵守以下法律法规：

### 《个人信息保护法》(2021.11.1)
- **第六条**：最小必要原则，仅上传必要媒体文件
- **第十三条**：上传含人脸、身份证等敏感信息图片需单独授权
- **第二十八条**：生物识别信息（人脸照片）为敏感个人信息，需加密存储
- **第五十一条**：采取加密等安全措施，媒体文件存储路径权限隔离

### 《网络安全法》(2017.6.1)
- **第二十一条**：文件上传过滤恶意扩展名（`disallowed_extensions` 黑名单）
- **第四十二条**：媒体文件访问需权限控制

### 《数据安全法》(2021.9.1)
- **第二十一条**：上传文件按类型、敏感度分类存储
- **第二十七条**：文件上传操作需审计日志

### 《著作权法》(2021.6.1)
- **第二十四条**：用户上传内容需获得版权授权
- **第四十七条**：需建立侵权投诉处理机制

### 《广告法》(2021.4.29 修订)
- **第九条**：上传图片内容需合规审核，不得使用国家级、最高级等用语

## 隐私保护

| 保护措施 | 说明 |
|------|------|
| EXIF 剥离 | 去除 GPS 定位、设备信息、拍摄时间等元数据 |
| MIME 校验 | 防止伪装文件扩展名攻击 |
| 扩展名黑名单 | 禁止上传可执行文件、脚本文件 |
| 文件大小限制 | 防止存储滥用和 DoS 攻击 |
| 权限隔离 | 媒体文件存储路径权限控制 |

详见 [LEGAL.md](LEGAL.md)。

## 依赖

- PHP ^8.5
- Laravel ^13.0
- kylin/core
- intervention/image
- spatie/image-optimizer
- spatie/temporary-directory

## 许可证

私有软件，未经授权禁止使用。
