存储适配器
Payload 提供了额外的存储适配器来处理文件上传。这些适配器允许你将文件存储在不同的位置,例如 Amazon S3、Vercel Blob Storage、Google Cloud Storage 等。
服务 | 包 |
---|---|
Vercel Blob | @payloadcms/storage-vercel-blob |
AWS S3 | @payloadcms/storage-s3 |
Azure | @payloadcms/storage-azure |
Google Cloud Storage | @payloadcms/storage-gcs |
Uploadthing | @payloadcms/storage-uploadthing |
Vercel Blob Storage
@payloadcms/storage-vercel-blob
安装
pnpm add @payloadcms/storage-vercel-blob
使用方法
- 配置
collections
对象来指定哪些集合应使用 Vercel Blob 适配器。slug 必须 与你现有的集合 slug 匹配。 - 确保在 Vercel 环境变量中设置了
BLOB_READ_WRITE_TOKEN
。通常在项目中添加 blob 存储后,Vercel 会自动设置此变量。 - 启用后,此包会自动将每个集合的
disableLocalStorage
设置为true
。 - 部署到 Vercel 时,服务器上传限制为 4.5MB。将
clientUploads
设为true
可直接在客户端进行上传。
import { vercelBlobStorage } from '@payloadcms/storage-vercel-blob'
import { Media } from './collections/Media'
import { MediaWithPrefix } from './collections/MediaWithPrefix'
export default buildConfig({
collections: [Media, MediaWithPrefix],
plugins: [
vercelBlobStorage({
enabled: true, // 可选,默认为 true
// 指定哪些集合应使用 Vercel Blob
collections: {
media: true,
'media-with-prefix': {
prefix: 'my-prefix',
},
},
// 在 Vercel 项目中添加 Blob 存储后提供的令牌
token: process.env.BLOB_READ_WRITE_TOKEN,
}),
],
})
配置选项
Option | Description | Default |
---|---|---|
enabled | 是否启用该插件 | true |
collections | 应用 Vercel Blob 适配器的集合 | |
addRandomSuffix | 在 Vercel Blob 存储中为上传的文件名添加随机后缀 | false |
cacheControlMaxAge | Cache-Control max-age 缓存时间(秒) | 365 * 24 * 60 * 60 (1年) |
token | Vercel Blob 存储的读写令牌 | '' |
clientUploads | 直接在客户端上传以绕过 Vercel 的限制 |
S3 存储
安装
pnpm add @payloadcms/storage-s3
使用方法
- 配置
collections
对象来指定哪些集合应使用 S3 存储适配器。slug 必须 匹配你现有的集合 slug。 config
对象可以是任何S3ClientConfig
对象(来自@aws-sdk/client-s3
)。这高度依赖于你的 AWS 设置。更多信息请查阅 AWS 文档。- 启用后,此包会自动为每个集合将
disableLocalStorage
设置为true
。 - 部署到 Vercel 时,服务器上传限制为 4.5MB。将
clientUploads
设置为true
可直接在客户端进行上传。你必须为存储桶允许来自你网站的 CORS PUT 方法。 - 配置
signedDownloads
(全局或在collections
中按集合配置)以使用 预签名 URL 进行文件下载。这可以提高大文件(如视频)的性能,同时仍遵守你的访问控制。
import { s3Storage } from '@payloadcms/storage-s3'
import { Media } from './collections/Media'
import { MediaWithPrefix } from './collections/MediaWithPrefix'
export default buildConfig({
collections: [Media, MediaWithPrefix],
plugins: [
s3Storage({
collections: {
media: true,
'media-with-prefix': {
prefix,
},
},
bucket: process.env.S3_BUCKET,
config: {
credentials: {
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
},
region: process.env.S3_REGION,
// ... 其他 S3 配置
},
}),
],
})
配置选项
有关 AWS S3 配置的指导,请参阅 AWS SDK 包 和 S3ClientConfig
对象。
Azure Blob 存储
安装
pnpm add @payloadcms/storage-azure
使用方法
- 配置
collections
对象来指定哪些集合应使用 Azure Blob 适配器。slug 必须 匹配你现有的集合 slug。 - 启用后,此包会自动将每个集合的
disableLocalStorage
设置为true
。 - 部署到 Vercel 时,服务器上传限制为 4.5MB。将
clientUploads
设置为true
可直接在客户端进行上传。你必须为你的网站允许 CORS PUT 方法。
import { azureStorage } from '@payloadcms/storage-azure'
import { Media } from './collections/Media'
import { MediaWithPrefix } from './collections/MediaWithPrefix'
export default buildConfig({
collections: [Media, MediaWithPrefix],
plugins: [
azureStorage({
collections: {
media: true,
'media-with-prefix': {
prefix,
},
},
allowContainerCreate:
process.env.AZURE_STORAGE_ALLOW_CONTAINER_CREATE === 'true',
baseURL: process.env.AZURE_STORAGE_ACCOUNT_BASEURL,
connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING,
containerName: process.env.AZURE_STORAGE_CONTAINER_NAME,
}),
],
})
配置选项
Option | 描述 | 默认值 |
---|---|---|
enabled | 是否启用该插件 | true |
collections | 应用 Azure Blob 适配器的 collections | |
allowContainerCreate | 当容器不存在时是否允许创建 | false |
baseURL | Azure Blob 存储账户的基础 URL | |
connectionString | Azure Blob 存储连接字符串 | |
containerName | Azure Blob 存储容器名称 | |
clientUploads | 直接在客户端上传以绕过 Vercel 的限制 |
Google Cloud Storage
安装
pnpm add @payloadcms/storage-gcs
使用方法
- 配置
collections
对象来指定哪些集合应使用 Google Cloud Storage 适配器。slug 必须 与你现有的集合 slug 匹配。 - 启用后,此包会自动将每个集合的
disableLocalStorage
设置为true
。 - 部署到 Vercel 时,服务器上传限制为 4.5MB。将
clientUploads
设置为true
可直接在客户端进行上传。你必须为存储桶允许来自你网站的 CORS PUT 方法。
import { gcsStorage } from '@payloadcms/storage-gcs'
import { Media } from './collections/Media'
import { MediaWithPrefix } from './collections/MediaWithPrefix'
export default buildConfig({
collections: [Media, MediaWithPrefix],
plugins: [
gcsStorage({
collections: {
media: true,
'media-with-prefix': {
prefix,
},
},
bucket: process.env.GCS_BUCKET,
options: {
apiEndpoint: process.env.GCS_ENDPOINT,
projectId: process.env.GCS_PROJECT_ID,
},
}),
],
})
配置选项
Option | 描述 | 默认值 |
---|---|---|
enabled | 是否启用该插件 | true |
collections | 应用该存储的 collections | |
bucket | 使用的存储桶名称 | |
options | Google Cloud Storage 客户端配置。参见文档 | |
acl | 上传文件的访问控制列表 | Private |
clientUploads | 直接在客户端上传以绕过 Vercel 的限制。 |
Uploadthing 存储
@payloadcms/storage-uploadthing
安装
pnpm add @payloadcms/storage-uploadthing
使用方法
- 配置
collections
对象来指定哪些集合应使用 uploadthing。slug 必须 匹配你现有的集合 slug 并且是upload
类型。 - 从 Uploadthing 获取 token 并在
options
对象中设置为token
。 acl
是可选的,默认为public-read
。- 当部署到 Vercel 时,服务器上传限制为 4.5MB。将
clientUploads
设置为true
可直接在客户端进行上传。
export default buildConfig({
collections: [Media],
plugins: [
uploadthingStorage({
collections: {
media: true,
},
options: {
token: process.env.UPLOADTHING_TOKEN,
acl: 'public-read',
},
}),
],
})
配置选项
选项 | 描述 | 默认值 |
---|---|---|
token | 来自 Uploadthing 的 token。必填项。 | |
acl | 上传文件的访问控制列表 | public-read |
logLevel | Uploadthing 的日志级别 | info |
fetch | 自定义 fetch 函数 | fetch |
defaultKeyType | 文件操作的默认键类型 | fileKey |
clientUploads | 直接在客户端上传以绕过 Vercel 的限制。 |
自定义存储适配器
如果需要创建自定义存储适配器,可以使用 @payloadcms/plugin-cloud-storage
包。上述存储适配器内部都使用了这个包。
安装方法
pnpm add @payloadcms/plugin-cloud-storage
使用方法
可以参考现有的存储适配器来了解如何构建。创建一个遵循 GeneratedAdapter
接口的适配器,然后将适配器传递给 cloudStorage
插件。
export interface GeneratedAdapter {
/**
* 要注入到基础集合和图片尺寸中的额外字段
*/
fields?: Field[]
/**
* 为文件生成公开 URL
*/
generateURL?: GenerateURL
handleDelete: HandleDelete
handleUpload: HandleUpload
name: string
onInit?: () => void
staticHandler: StaticHandler
}
import { buildConfig } from 'payload'
import { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'
export default buildConfig({
plugins: [
cloudStorage({
collections: {
'my-collection-slug': {
adapter: theAdapterToUse, // 查看你想使用的适配器文档
},
},
}),
],
// 其余配置写在这里
})
插件选项
该插件可配置为适用于多个不同的 Payload 集合。标有 *
的表示该属性为必填项。
选项 | 类型 | 描述 |
---|---|---|
collections * | Record<string, CollectionOptions> | 对象,键设置为要启用插件的集合 slug,值设置为特定于集合的选项。 |
enabled | boolean | 有条件地启用/禁用插件。默认值:true 。 |
集合特定选项
选项 | 类型 | 描述 |
---|---|---|
adapter * | Adapter | 传入你想用于此集合的适配器。你也可以在某些场景下将此字段设为 null 以绕过云存储并使用本地存储进行开发。 |
disableLocalStorage | boolean | 选择是否禁用此集合的本地存储。默认为 true 。 |
disablePayloadAccessControl | true | 设置为 true 以禁用 Payload 的访问控制。更多 |
prefix | string | 设置为 media/images 可将文件上传到存储桶中的 media/images 文件夹内。 |
generateFileURL | GenerateFileURL | 用你自定义的 URL 覆盖生成的文件 URL。 |
Payload 访问控制
Payload 内置了访问控制功能,该功能_即使在静态文件服务时也会运行_。系统会使用你已启用 upload
的集合中的 read
访问控制属性,允许你限制谁可以请求上传的文件。
为了保留这一特性,默认情况下,本插件_保持所有文件URL完全不变_。你的文件URL不会被更新为直接指向云存储源,因为那样会完全绕过Payload的访问控制,你将需要在云托管文件上设置公共可读性。
相反,所有上传文件仍将通过默认的 /collectionSlug/staticURL/filename
路径访问。本插件会将托管在第三方云服务上的所有文件"透传"——额外的好处是保持你现有的访问控制不变。
如果这不适用于你(你的上传集合设置了 read: () => true
或类似配置),你可以通过将 disablePayloadAccessControl
设置为 true
来禁用此功能。启用此设置后,本插件将更新你的文件URL,使其直接指向云主机。
条件性启用/禁用
条件性启用/禁用本插件的正确方法是使用 enabled
属性。
cloudStoragePlugin({
enabled: process.env.MY_CONDITION === 'true',
collections: {
'my-collection-slug': {
adapter: theAdapterToUse, // 参阅你想使用的适配器文档
},
},
}),