Skip to content

📎 附件上传与存储

SunAdmin 上传链路由 Controller、Request、UploadService、StorageDriverManager 和存储驱动组成。

🎯 本页目标

读完本章节后,应能掌握:

  • Admin 与用户端的上传接口分别是什么、需要带哪些校验参数。
  • 本地存储、七牛、阿里云 OSS、腾讯云 COS 在配置和切换上的差异。
  • 媒体 URL 在保存与读取阶段如何在相对路径与完整 URL 之间自动转换。
  • 上传相关的大小、扩展名、富文本资源的统一处理边界。

⬆️ 上传接口

Admin:

text
POST /adminapi/system/upload/file

用户端:

text
POST /api/system/upload/file
GET  /api/system/upload/validate

⭐ 上传配置

配置位置:

text
config/sunadmin.php

支持的上传类型:

type扩展名大小
imagejpg、jpeg、png、gif、bmp、webp、svg5MB
videomp4、mov、avi、wmv、mkv、webm50MB
filepdf、doc、docx、xls、xlsx、ppt、pptx、zip、rar、txt、md20MB

🧱 上传服务

核心文件:

text
modules/System/Application/Services/File/UploadService.php

主要流程:

  1. 根据 type 读取上传配置。
  2. 校验扩展名和大小。
  3. 通过 StorageDriverManager 解析存储驱动。
  4. 生成 uploads/{type}/{Ymd}/{His}{random}.{ext} 路径。
  5. 调用驱动写入物理文件。
  6. 写入文件表。
  7. 返回文件 ID、URL、扩展名、大小等信息。

返回字段:

字段说明
id文件记录 ID
cid分类 ID
type文件类型枚举
name原始文件名
uri文件地址
urluri 保持一致,方便前端
ext扩展名
mimeMIME
size文件大小
module业务模块
tag业务标签

💾 存储驱动

管理器:

text
modules/System/Application/Services/File/StorageDriverManager.php

支持驱动:

engine驱动
local本地存储
qiniu七牛云
aliyun阿里云 OSS
qcloud腾讯云 COS

默认存储引擎从后台配置读取:

php
$this->configService->getValue('storage', 'default', 'local')

云存储必填项:

engine必填
qiniubucket、access_key、secret_key、domain
aliyunbucket、access_key、secret_key、domain
qcloudbucket、region、access_key、secret_key、domain

🔁 媒体 URL 转换

转换器:

text
app/Support/File/MediaUrlTransformer.php

职责:

  • API 输出时把本地相对路径补成完整 URL。
  • 保存时把本站完整 URL 还原为相对路径,第三方存储会保留完整URL。
  • 富文本中只处理 srchrefposter 资源属性。
  • data、blob、javascript、mailto、tel、锚点等特殊协议不处理。

🏠 本地存储注意事项

本地存储需要执行以下命令确保已经初始化本地存储目录映射(通过安装向导初始化会自动处理,无需手工操作):

bash
# 创建 public/storage 到 storage/app/public 的公开访问软链接
php artisan storage:link

并确保以下目录可写:

text
storage/
public/storage/

🤳 前端上传注意事项

Admin 上传走后台 token,接口前缀为 adminapi

uni-app 上传走用户端接口。小程序/App 必须配置完整 VITE_APP_BASE_URL,否则上传 URL 无法拼成合法请求地址。

📌 安全建议

  • 不允许上传未配置扩展名。
  • 不使用原始文件名作为物理文件名。
  • 原始文件名最长保留 100 个字符。
  • 云存储 URL 不做反向相对路径替换。
  • 富文本保存时只还原本站资源 URL,外链保持原样。