如何从Node.js Express应用直接上传图片至Cloudinary,无需服务器存储
实现无需服务器存储的图片上传(适配Vercel环境)
核心思路是让前端直接将图片上传至云存储服务/第三方文件托管平台,完全跳过Vercel服务器的文件存储环节,只保留必要的凭证生成或结果校验逻辑。
方案一:云存储直传(推荐)
选择支持前端直传的云存储服务(如阿里云OSS、腾讯云COS、AWS S3等),流程如下:
后端生成临时上传凭证
在Vercel的API路由中,调用云存储的SDK生成临时签名/上传凭证(仅生成字符串凭证,不会创建任何文件),返回给前端。
示例(Next.js API路由):import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; export default async function handler(req, res) { const s3Client = new S3Client({ region: process.env.AWS_REGION, credentials: { accessKeyId: process.env.AWS_ACCESS_KEY, secretAccessKey: process.env.AWS_SECRET_KEY, }, }); const command = new PutObjectCommand({ Bucket: process.env.AWS_S3_BUCKET, Key: `uploads/${Date.now()}-${req.query.filename}`, }); const uploadUrl = await getSignedUrl(s3Client, command, { expiresIn: 3600 }); res.status(200).json({ uploadUrl }); }前端直接上传至云存储
前端拿到签名后的上传地址,通过fetch直接将图片文件上传至云存储,全程不经过Vercel服务器存储。
示例:async function uploadImage(file) { // 请求后端获取上传凭证 const res = await fetch(`/api/get-upload-url?filename=${file.name}`); const { uploadUrl } = await res.json(); // 直接上传到云存储 await fetch(uploadUrl, { method: 'PUT', body: file, headers: { 'Content-Type': file.type, }, }); return uploadUrl.split('?')[0]; // 返回文件永久访问地址 }
方案二:第三方文件托管平台直传
使用Cloudinary、Imgur等提供直传API的服务,前端直接调用其上传接口,无需经过自己的服务器:
- 前端直接调用第三方上传接口
示例(Cloudinary):async function uploadToCloudinary(file) { const formData = new FormData(); formData.append('file', file); formData.append('upload_preset', process.env.NEXT_PUBLIC_CLOUDINARY_PRESET); const res = await fetch(`https://api.cloudinary.com/v1_1/${process.env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME}/image/upload`, { method: 'POST', body: formData, }); const data = await res.json(); return data.secure_url; // 返回图片访问地址 }
关键注意事项
- 所有操作均不会在Vercel服务器创建文件或目录,完全符合平台限制
- 若需校验上传结果,可让云存储服务/第三方平台调用Vercel的API接口,传递文件元信息(如地址、大小等),后端仅需处理这些数据,无需存储文件
内容的提问来源于stack exchange,提问作者Saad Afzal
相关产品推荐
相关产品推荐

