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

如何通过Multer结合Fastify实现文件上传至Cloudinary

使用Multer + Fastify 实现文件上传至Cloudinary

1. 初始化项目并安装依赖

先创建并初始化Node.js项目,然后安装所需依赖:

npm init -y
npm install fastify multer cloudinary multer-storage-cloudinary @fastify/middie

2. 配置Cloudinary

创建配置文件(比如cloudinary.config.js),填入你的Cloudinary账户信息:

const cloudinary = require('cloudinary').v2;

cloudinary.config({
  cloud_name: '你的Cloudinary云名称',
  api_key: '你的API密钥',
  api_secret: '你的API密钥密码'
});

module.exports = cloudinary;

3. 配置Multer存储引擎

使用multer-storage-cloudinary创建Cloudinary存储实例,替代本地存储:

const multer = require('multer');
const { CloudinaryStorage } = require('multer-storage-cloudinary');
const cloudinary = require('./cloudinary.config');

const storage = new CloudinaryStorage({
  cloudinary: cloudinary,
  params: {
    folder: 'fastify-uploads', // 上传到Cloudinary的目标文件夹
    allowed_formats: ['jpg', 'png', 'webp', 'gif'], // 允许的文件格式
    // 可选:自定义文件名逻辑
    filename: (req, file, cb) => {
      cb(null, `${Date.now()}-${file.originalname}`);
    }
  }
});

const upload = multer({ storage: storage });
module.exports = upload;

4. 启用Fastify的中间件支持

Fastify默认不兼容Express风格中间件,需通过@fastify/middie插件启用:

const fastify = require('fastify')({ logger: true });

// 注册middie插件
async function setupPlugins() {
  await fastify.register(require('@fastify/middie'));
}

setupPlugins();

5. 编写上传路由

创建POST路由,用Multer中间件处理文件上传,返回Cloudinary的上传结果:

const upload = require('./multer.config');

// 单文件上传接口
fastify.post('/upload', { preHandler: upload.single('file') }, async (req, reply) => {
  // req.file包含Cloudinary返回的完整文件元数据
  return reply.send({
    success: true,
    fileInfo: {
      url: req.file.path,
      filename: req.file.filename,
      size: req.file.size
    }
  });
});

// 多文件上传接口(最多5个文件)
fastify.post('/upload-multiple', { preHandler: upload.array('files', 5) }, async (req, reply) => {
  const fileList = req.files.map(file => ({
    url: file.path,
    filename: file.filename
  }));
  return reply.send({
    success: true,
    files: fileList
  });
});

// 启动服务器
fastify.listen({ port: 3000 }, (err) => {
  if (err) {
    fastify.log.error(err);
    process.exit(1);
  }
  fastify.log.info(`服务器运行在 http://localhost:3000`);
});

6. 测试上传

用curl命令测试单文件上传:

curl -X POST -F "file=@/本地文件路径/xxx.jpg" http://localhost:3000/upload

也可以用Postman发送POST请求,选择form-data类型,键名设为file(或files对应多文件接口),值选择本地文件。


内容的提问来源于stack exchange,提问作者Hassaan Haider .Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 18:34:50