mcpField
V
vercel-blob

vercel-blob

github.com/secondsky云与 DevOps240126 次安装5 周前更新
代码仓库

关于 vercel-blob

通过 SDK 使用 Vercel Blob 对象存储的开发技能,涵盖上传、删除、列表查询、客户端与分段上传,并提供常见存储工作流的实践指引。

主要功能

  1. 01上传、列出和删除 Blob
  2. 02使用上传令牌进行客户端上传
  3. 03分段上传模式
  4. 04基于游标的列表与分页
  5. 05常见模式及问题排查

适用场景

  1. 01存储用户头像
  2. 02上传私有文档
  3. 03构建可分页的图片库
  4. 04处理大文件或多文件上传

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/secondsky/claude-skills --skill vercel-blob

安装后在 Claude Code 中输入/vercel-blob确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

assets/
example-template.txt
references/
common-patterns.md
known-issues.md
scripts/
example-script.sh
templates/
avatar-upload-flow.tsx
drag-drop-upload.tsx
file-list-manager.tsx
package.json

详细介绍

Vercel Blob(对象存储)

状态:已可用于生产环境 最后更新:2025-12-14 依赖项:无 最新版本:@vercel/[email protected]


快速开始(3 分钟)

1. 创建并配置
# In Vercel dashboard: Storage → Create Database → Blob
vercel env pull .env.local

创建:BLOB_READ_WRITE_TOKEN

2. 安装
bun add @vercel/blob
3. 上传文件(服务端操作)
'use server';

import { put } from '@vercel/blob';

export async function uploadFile(formData: FormData) {
  const file = formData.get('file') as File;

  const blob = await put(file.name, file, {
    access: 'public',
    contentType: file.type
  });

  return blob.url;
}
4. 基本操作
import { put, del, list } from '@vercel/blob';

// Upload
const blob = await put('path/file.jpg', file, { access: 'public' });

// Delete
await del(blob.url);

// List with pagination
const { blobs, cursor } = await list({ prefix: 'uploads/', limit: 100 });

关键规则

始终执行
规则原因
客户端上传时使用客户端上传令牌切勿向客户端暴露 BLOB_READ_WRITE_TOKEN
显式设置 contentType确保浏览器正确处理 PDF、视频等文件
使用 access: 'public' 以启用 CDN 缓存私有文件不会经过 CDN
上传前验证文件类型和大小防止上传无效文件
按路径名组织文件avatars/、uploads/、documents/
替换文件时删除旧文件控制存储成本
切勿执行
规则原因
向客户端暴露 BLOB_READ_WRITE_TOKEN安全漏洞
未使用分片上传就上传大于 500MB 的文件使用 createMultipartUpload API
使用通用文件名使用 ${Date.now()}-${name} 或 addRandomSuffix: true
跳过文件验证始终验证类型和大小
未加密就存储敏感数据上传前先加密
忘记处理分页list() 最多返回 1000 个文件

已知问题预防

此技能可预防 10 个已记录问题:

#错误快速修复
1BLOB_READ_WRITE_TOKEN not defined运行 vercel env pull .env.local
2客户端令牌泄露使用 handleUpload() 进行客户端上传
3文件超出大小限制(500MB)使用分片上传 API
4content-type 错误设置 contentType: file.type
5未启用 CDN 缓存使用 access: 'public'
6列表中缺少文件使用游标分页
7删除操作静默失败使用 put() 返回的确切 URL
8上传超时大文件使用客户端上传
9文件名冲突添加时间戳或使用 addRandomSuffix: true
10状态未更新使用 onUploadCompleted 回调

参见:references/known-issues.md,其中包含完整解决方案和代码示例。


常见模式摘要

模式用例关键 API
头像上传用户个人资料图片put、del
受保护的上传私有文档使用 access: 'private' 的 put
图片库列出并分页使用游标的 list
客户端上传大文件、进度upload、handleUpload
分片上传大于 500MB 的文件createMultipartUpload、uploadPart
批量操作多个文件Promise.all、del([...])
图片处理上传前优化sharp + put

参见:references/common-patterns.md,其中包含完整实现。


客户端上传(必要模式)

服务端操作(令牌生成):

'use server';

import { handleUpload, type HandleUploadBody } from '@vercel/blob/client';

export async function generateUploadToken(body: HandleUploadBody) {
  return await handleUpload({
    body,
    request: new Request('https://dummy'),
    onBeforeGenerateToken: async (pathname) => ({
      allowedContentTypes: ['image/jpeg', 'image/png', 'image/webp'],
      maximumSizeInBytes: 5 * 1024 * 1024
    }),
    onUploadCompleted: async ({ blob }) => {
      // Save to database
      await db.insert(uploads).values({ url: blob.url, pathname: blob.pathname });
    }
  });
}

客户端组件:

'use client';

import { upload } from '@vercel/blob/client';

const blob = await upload(file.name, file, {
  access: 'public',
  handleUploadUrl: '/api/upload'
});

配置

.env.local
# Created by: vercel env pull .env.local
BLOB_READ_WRITE_TOKEN="vercel_blob_rw_xxxxx"
.gitignore
.env.local
.env*.local

何时加载参考资料

参考资料加载时机……
references/known-issues.md调试上传错误、令牌问题或 CDN 缓存问题时
references/common-patterns.md实现头像上传、图片库、客户端上传或分片上传时

依赖项

{
  "dependencies": {
    "@vercel/blob": "^2.0.0"
  }
}

免费套餐限制:每月 100GB 带宽,文件大小上限为 500MB


官方文档


故障排除

问题解决方案
BLOB_READ_WRITE_TOKEN not defined运行 vercel env pull .env.local
文件大小超出限制(>500MB)使用分片上传 API
客户端上传失败在服务端使用 handleUpload()
文件未删除使用 put() 响应中的确切 URL

节省 Token:约 60%(将模式提取到参考资料中) 错误预防:100%(记录了全部 10 个问题) 已可用于生产!

评论

支持 Markdown