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
相关产品推荐
相关产品推荐

