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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:24:13