You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vercel部署Next.js 13后上传文件至public目录遇权限错误

问题原因

Vercel生产环境采用只读文件系统(EROFS),部署后的项目目录(包括public)属于静态打包资源,不允许运行时执行写入操作。本地开发环境拥有文件系统读写权限,因此代码能正常工作,但部署到Vercel后会触发权限错误。

解决方案:用云存储替代本地文件写入

Vercel官方推荐使用专用云存储服务处理文件上传,比如Vercel Blob(与Vercel深度集成)、Cloudinary、AWS S3等。以下以Vercel Blob为例修改代码:

步骤1:安装依赖

npm install @vercel/blob

步骤2:配置环境变量

在Vercel项目控制台添加环境变量BLOB_READ_WRITE_TOKEN,取值可从Vercel Dashboard的Blob服务页面获取。

步骤3:修改API路由代码

import { put } from '@vercel/blob';
import { type NextRequest, NextResponse } from "next/server";
import sharp from 'sharp';
import { v4 as uuidv4 } from 'uuid';

export async function POST(request: NextRequest) {
  const formData = await request.formData();
  const file: File | null = formData.get('file') as unknown as File;

  if (!file) return NextResponse.json({ success: false });

  const bytes = await file.arrayBuffer();
  const buffer = Buffer.from(bytes);
  
  // 转换为webp格式
  const webpBuffer = await sharp(buffer).toFormat('webp').toBuffer();
  const fileName = `${uuidv4()}.webp`;

  // 上传到Vercel Blob
  const { url } = await put(fileName, webpBuffer, {
    access: 'public', // 设置为公开访问
  });

  // 返回正确的JSON响应(原headers的image/png错误,应改为application/json)
  return NextResponse.json({ 
    success: true, 
    message: "文件上传成功", 
    imageUrl: url 
  }, { status: 200 });
}

其他注意事项

  • 若选择其他存储服务(如Cloudinary),核心逻辑一致:将文件缓冲区上传至第三方服务,获取访问URL,而非写入本地文件系统。
  • 禁止在Vercel Serverless Functions中尝试写入任何本地路径,所有持久化数据需依赖外部存储服务。

内容的提问来源于stack exchange,提问作者26ph19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:33:33