跳到正文

储存 ​

储存决定上传的图片保存在哪里、以什么地址访问。系统中可以创建多个储存,每个储存选择一种驱动,再通过角色组分配给用户。

在管理后台的「储存管理」页面,点击「新建」按钮即可创建储存。表单分为「通用」「配置」「处理器」三个标签页。

支持的储存 ​

目前支持 10 种驱动:本地、AWS S3、阿里云 OSS、腾讯云 COS、七牛云 Kodo、又拍云 USS、多吉云、Sftp、Ftp、Webdav。其中:

  • 本地:保存在程序所在服务器的目录中
  • AWS S3:Amazon S3,以及兼容 S3 接口的储存,见兼容 S3 的储存
  • 七牛云 Kodo:需要填写绑定的域名,否则无法使用云处理
  • 多吉云:填写 Access Key、Secret Key 和 Bucket 名称,程序自动获取临时密钥

不支持自行添加驱动。需要其他储存时,可以先看它是否兼容 S3、WebDAV、SFTP 或 FTP 协议,兼容的可以用对应驱动接入;也可以到论坛提出需求。

兼容 S3 的储存 ​

MinIO、Backblaze B2 等兼容 S3 接口的储存,选择「AWS S3」驱动接入,填写服务商提供的 Endpoint、Region、Bucket 和密钥即可。自建的 MinIO 等服务通常需要打开「Path style」。

AWS S3 驱动的「自定义配置」用于传入额外的参数,配置名用 . 表示层级。例如配置名 params.ACL 表示上传时的 ACL 参数:

  • 不添加:上传的文件设置为私有(private)。储存桶通过桶策略设为公开读取、或通过 CDN 回源访问时,可以正常访问
  • 配置值填 public-read:上传的文件设置为公开读。储存桶依靠文件的 ACL 公开访问时需要添加,否则图片链接会返回 403
  • 配置值留空:上传时发送空的 ACL,适合不支持 ACL 的储存,例如 Backblaze B2

储存是如何运作的 ​

「通用」标签页中的主要字段:

字段说明
访问 URL图片链接的域名部分,例如 https://img.example.com。对象储存通常填写绑定的 CDN 域名
命名规则文件保存的路径和名称,见支持的文件命名规则
访问前缀拼接在访问 URL 后面的一级目录,见访问前缀是什么
访问后缀返回图片链接时拼接在末尾的内容,例如云处理参数 ?p=small
生成缩略图是否为上传的图片生成缩略图,见缩略图

图片链接由「访问 URL / 访问前缀 / 文件路径 访问后缀」组成,例如 https://img.example.com/uploads/20260101/xxx.jpg。

「配置」标签页中填写驱动的连接信息和「储存目录」。储存目录必须是绝对路径:

  • 本地储存:可以是服务器上的任意目录,例如单独挂载的数据盘 /mnt/data/photos。请确保 Web 服务器和队列的运行用户对该目录有写入权限,否则上传会失败
  • 其他储存:填写储存桶或服务器中的目录,默认 / 表示根目录

创建或编辑本地储存时,程序会自动创建储存目录(不存在时),并在 public 目录中创建一个以访问前缀命名的符号链接,指向储存目录,见访问前缀是什么。

访问前缀是什么 ​

访问前缀是本地储存在 public 目录中的符号链接的名称,默认为 uploads。这样图片可以保存在 public 目录以外,仍然能通过网址访问。假设站点运行目录为 /www/app/public,本地储存的储存目录为 /mnt/data/photos,访问前缀为 uploads:

  • 程序创建符号链接 /www/app/public/uploads,指向 /mnt/data/photos
  • 访问 https://example.com/uploads/test.png 时,实际读取的是 /mnt/data/photos/test.png

开启云处理的储存不再使用符号链接,所有图片请求都交给程序处理,程序通过访问前缀找到对应的储存和云处理配置。

因此,本地储存和开启了云处理的储存必须填写访问前缀,其他储存可以留空。访问前缀只能包含字母、数字、- 和 _,不能与其他储存重复,也不能与 public 目录中已有的目录同名。

TIP

符号链接丢失(例如迁移服务器后)时,可以执行 php artisan symlinks:rebuild 重新创建,见常用命令。

处理器是什么 ​

「处理器」标签页中,每个储存可以分别关联一个图片安全驱动、图片处理驱动和云处理驱动,上传到该储存的图片会按这些驱动处理:

  • 图片安全驱动:上传后审核图片是否违规,可以使用第三方审核服务或 AI 大模型审核
  • 图片处理驱动:上传后修改原图,例如裁剪、缩放、添加水印、转换格式,见图片处理
  • 云处理驱动:访问图片时通过网址参数实时生成不同尺寸和样式的图片,原图不变,见云处理

WARNING

开启云处理后,图片请求由程序处理,请把「访问 URL」填写为程序的域名(或指向程序的 CDN 域名),否则云处理参数不会生效。

缩略图 ​

「生成缩略图」默认开启,程序在上传后生成缩略图,用于图片列表和广场。可以设置「缩略图最大尺寸」(默认 800 像素)和「缩略图质量」(默认 90)。图片的宽和高都超过最大尺寸时才会缩小。

缩略图统一保存在程序的 storage/app/public/thumbnails 目录中,不占用储存的空间。关闭期间上传的图片没有缩略图,重新开启后可以执行 php artisan app:thumbnail 补生成,见常用命令。

支持的文件命名规则 ​

命名规则决定文件保存的路径和名称,用 / 分隔目录,默认为 {Ymd}/{md5}。文件扩展名由程序自动加上,规则中不需要写 .{ext}。

变量示例值说明
{Y}2026年份
{y}26年份后两位
{m}01月份
{d}04日期
{Ymd}20260104年月日
{filename}photo原文件名(不含扩展名)
{ext}png原文件扩展名
{time}1767484800时间戳
{uniqid}667530e55196f唯一 ID
{md5}e10adc3949ba59abbe56e057f20f883e文件的 MD5 值
{sha1}7c4a8d09ca3762af61e59520943dc26494f8941b文件的 SHA1 值
{uuid}ca083d36-1f0a-4d2a-83f7-f3e97f4f4bfaUUID
{uid}1用户 ID,游客为 0

重复上传 ​

程序不会拒绝重复上传,是否保存新文件取决于命名规则生成的路径:

  • 路径已存在:不再写入文件,复用已有的文件。同一个用户在同一个储存中重复上传内容相同(MD5 和 SHA1 都相同)的图片时,沿用原来的图片记录,图片管理中不会多出一张;其他情况各自新建图片记录,共用同一个文件
  • 路径不同:保存为新的文件和新的图片。规则中有 {uuid} 或 {uniqid} 时每次路径都不同;{time} 精确到秒,同一秒内上传的文件路径可能相同;默认规则 {Ymd}/{md5} 下,同一张图片在不同日期上传也会保存为新文件

储存关联了图片处理驱动时,处理结果会改写文件,所以这类图片不与其他用户的图片共用文件:异步处理的图片上传时就保存到独立的路径;同步处理时遇到共用的文件,处理后也会改用独立的路径。

多张图片共用一个文件时,删除其中一张不会删除文件,直到没有图片使用它。

如何连接 Backblaze B2? ​

创建储存时选择「AWS S3」驱动,Region 填写 auto,在「自定义配置」中添加配置名 params.ACL、配置值留空(见兼容 S3 的储存)。如果连接失败,可以把 Region 改为 Endpoint 中的地域,例如 us-west-004。

配置示例

WARNING

Backblaze B2 的 Bucket 默认保留文件的历史版本,在图床后台删除图片后,B2 控制台中仍然能看到文件,这是正常现象。可以在 B2 的 Bucket 设置中调整生命周期规则,自动清除旧版本。