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

Node.js:通过REST API实现多部分文件上传(基于GCS Objects: insert)

使用Multer + Google Cloud Storage Objects: insert API实现多部分文件上传

没问题,我帮你整理了一个完整的可运行示例,涵盖从依赖安装到实际测试的全流程,直接照着做就能搞定:

1. 安装必要依赖

首先在你的项目里安装所需包:

npm install express multer @google-cloud/storage

2. 核心代码实现

创建一个server.js文件,内容如下:

const express = require('express');
const multer = require('multer');
const { Storage } = require('@google-cloud/storage');

const app = express();
const port = 3000;

// 配置Google Cloud Storage客户端
// 替换成你的服务账号密钥文件路径
const storage = new Storage({
  keyFilename: './path-to-your-service-account-key.json',
  projectId: 'your-google-cloud-project-id'
});
// 替换成你的GCS存储桶名称
const bucket = storage.bucket('your-bucket-name');

// 配置Multer:使用内存存储(适合中小文件,大文件可改用diskStorage)
const multerStorage = multer.memoryStorage();
const upload = multer({
  storage: multerStorage,
  limits: {
    fileSize: 5 * 1024 * 1024 // 限制单文件5MB,可根据需求调整
  }
});

// 多文件上传路由:接受name为"files"的多文件表单数据
app.post('/upload', upload.array('files', 10), async (req, res) => {
  try {
    if (!req.files || req.files.length === 0) {
      return res.status(400).json({ message: '请选择要上传的文件' });
    }

    const uploadResults = [];

    // 循环处理每个上传的文件
    for (const file of req.files) {
      // 创建GCS中的文件对象(对应Objects: insert API的初始化)
      const gcsFile = bucket.file(file.originalname);

      // 创建写入流,将文件缓冲区写入GCS(对应Objects: insert的媒体上传)
      const stream = gcsFile.createWriteStream({
        metadata: {
          contentType: file.mimetype,
          // 可添加自定义元数据
          customMetadata: {
            uploadedBy: 'multer-demo'
          }
        },
        resumable: false // 小文件可关闭断点续传,大文件建议开启
      });

      // 处理流的完成和错误事件
      await new Promise((resolve, reject) => {
        stream.on('finish', resolve);
        stream.on('error', reject);
        stream.end(file.buffer);
      });

      // 获取上传后文件的公开访问URL(如果桶设置了公开读权限)
      const publicUrl = `https://storage.googleapis.com/${bucket.name}/${gcsFile.name}`;
      uploadResults.push({
        filename: file.originalname,
        url: publicUrl,
        size: file.size
      });
    }

    res.status(200).json({
      message: '文件上传成功',
      data: uploadResults
    });
  } catch (error) {
    console.error('上传失败:', error);
    res.status(500).json({ message: '文件上传失败', error: error.message });
  }
});

app.listen(port, () => {
  console.log(`服务器运行在 http://localhost:${port}`);
});

3. 关键说明

  • GCS配置:确保你已经创建了GCS存储桶,并且服务账号拥有storage.objects.create权限(对应Objects: insert API的权限要求)。
  • Multer配置:这里用memoryStorage把文件暂存在内存,适合中小文件;如果是大文件,建议改用multer.diskStorage先存到本地,再上传到GCS,避免内存溢出。
  • Objects: insert对应关系:代码中bucket.file()创建文件对象对应API的name参数,createWriteStream()的metadata对应API的metadata字段,写入缓冲区的操作就是API的媒体内容上传环节。

4. 测试上传

你可以用curl命令测试多文件上传:

curl -X POST -F "files=@/path/to/your/file1.jpg" -F "files=@/path/to/your/file2.txt" http://localhost:3000/upload

或者用Postman:创建POST请求,选择form-data,添加key为files的字段,选择多个文件后发送请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:15:12