Skip to content

作者

novlan1

2025.9.7

上传图片至COS

express 中使用了 multer 中间件,关键点:

  1. multer 只处理前端 multipart/form-data 类型数据
  2. req.file 就是文件信息,req.body 就是其他结构化信息
  3. 使用内存,而不是保存文件到本地,避免写入再删除
  4. COS 上传 Body 参数接受 BufferBody 可接受的类型有 Buffer | string | StreamStream 就是 fs.createReadStream 返回值
js
// 配置 multer
// 这里选择“内存存储”,文件将保存在 Buffer 中,避免写入磁盘再删除的步骤
// 但如果文件非常大,需考虑内存限制,此时可用磁盘存储,并在上传后删除临时文件
const storage = multer.memoryStorage(); 
const upload = multer({
  storage: storage,
  // 可选:文件过滤和限制
  fileFilter: (req, file, cb) => {
    // 例如,只允许图像文件
    if (file.mimetype.startsWith('image/')) {
      cb(null, true);
    } else {
      cb(new Error('只允许上传图片文件!'), false);
    }
  },
  limits: {
    fileSize: 5 * 1024 * 1024, // 限制文件大小为 5MB
  },
});

// 准备上传参数
const params = {
  Bucket: process.env.COS_BUCKET, // 格式如 'examplebucket-1250000000'
  Region: process.env.COS_REGION, // 地域,如 'ap-beijing'
  Key: cosFileName, // 对象键(Key),即文件在 COS 上的完整路径
  Body: req.file.buffer, // 从内存存储中获取文件 Buffer
  ContentLength: req.file.size,
};

前端使用 history 路由模式,devcloud 中的 nginx 配置如下:

sh
location /next-admin {
  try_files $uri $uri/ /next-admin/index.html;
}

# 后台
location /next-cgi/ {
  proxy_pass http://localhost:3098/;
}