Files
payloadcms/packages/storage-vercel-blob
Alessio Gravili b2f9d4e9a4 fix(storage-vercel-blob): filename is incorrectly stored encoded when addRandomSuffix is true (#13746)
Previously, if `addRandomSuffix` is set to true, the filename would be
stored URL-encoded in the database:

<img width="2212" height="140" alt="Screenshot 2025-09-08 at 18 47
50@2x"
src="https://github.com/user-attachments/assets/1b001e30-0154-4764-a2e9-b7d8bf729581"
/>

If in addition to that, if you set `disablePayloadAccessControl: true`,
Payload will url-encode the already url-encoded filename on read,
leading to an error.

This PR fixes this issue by always decoding the filename before storing
it in the database, so that they're always stored unencoded, no matter
if `addRandomSuffix` is set or not:

<img width="1730" height="184" alt="Screenshot 2025-09-08 at 18 49
29@2x"
src="https://github.com/user-attachments/assets/44328bfa-e489-4247-9e9b-7ddc6e271afb"
/>


---
- To see the specific tasks where the Asana app for GitHub is being
used, see below:
  - https://app.asana.com/0/0/1211177878397844
2025-09-08 22:14:29 -04:00
..
2025-08-28 09:47:54 -04:00

Vercel Blob Storage for Payload

This package provides a simple way to use Vercel Blob storage with Payload.

NOTE: This package removes the need to use @payloadcms/plugin-cloud-storage as was needed in Payload 2.x.

Installation

pnpm add @payloadcms/storage-vercel-blob

Usage

  • Configure the collections object to specify which collections should use the Vercel Blob adapter. The slug must match one of your existing collection slugs.
  • Ensure you have BLOB_READ_WRITE_TOKEN set in your Vercel environment variables. This is usually set by Vercel automatically after adding blob storage to your project.
  • When enabled, this package will automatically set disableLocalStorage to true for each collection.
  • When deploying to Vercel, server uploads are limited with 4.5MB. Set clientUploads to true to do uploads directly on the client.
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, // Optional, defaults to true
      // Specify which collections should use Vercel Blob
      collections: {
        media: true,
        'media-with-prefix': {
          prefix: 'my-prefix',
        },
      },
      // Token provided by Vercel once Blob storage is added to your Vercel project
      token: process.env.BLOB_READ_WRITE_TOKEN,
    }),
  ],
})
Option Description Default
enabled Whether or not to enable the plugin true
collections Collections to apply the Vercel Blob adapter to
addRandomSuffix Add a random suffix to the uploaded file name in Vercel Blob storage false
cacheControlMaxAge Cache-Control max-age in seconds 365 * 24 * 60 * 60 (1 Year)
token Vercel Blob storage read/write token ''
clientUploads Do uploads directly on the client to bypass limits on Vercel