AWS S3使用multer-s3返回文件路径中Bucket名称重复问题求助
解决multer-s3返回URL中Bucket名称重复的问题
你的问题是文件能成功上传到S3,但返回的file.location里Bucket名称重复,这是因为新版AWS SDK v3的S3Client默认配置和multer-s3的URL生成逻辑不兼容导致的。以下是两种可行的解决方法:
方法一:显式指定S3Client的endpoint
在创建S3Client实例时,添加标准的区域endpoint配置,避免multer-s3错误拼接Bucket名称:
const { S3Client } = require('@aws-sdk/client-s3'); const multer = require('multer'); const multerS3 = require('multer-s3'); require('dotenv').config(); const credentials = { region: process.env.region, credentials: { accessKeyId: process.env.accessKeyId, secretAccessKey: process.env.secretAccessKey, }, // 添加标准S3区域endpoint endpoint: `https://s3.${process.env.region}.amazonaws.com` }; const s3 = new S3Client(credentials); const imageFilter = (req, file, cb) => { if (file.mimetype.startsWith('image')) { cb(null, true); } else { cb('Please upload only images.', false); } }; const uploadFile = multer({ storage: multerS3({ s3: s3, bucket: 'MYBUCKET', metadata: function (req, file, cb) { cb(null, { fieldName: file.fieldname }); }, key: function (req, file, cb) { cb(null, `${Date.now()}-img-${file.originalname}`); }, }), fileFilter: imageFilter, limits: { fieldSize: '50mb', }, }); module.exports = uploadFile;
方法二:在multer-s3配置中指定endpoint
如果不想修改S3Client的全局配置,也可以直接在multer-s3的存储配置里添加endpoint参数:
const uploadFile = multer({ storage: multerS3({ s3: s3, bucket: 'MYBUCKET', // 添加标准S3区域endpoint endpoint: `https://s3.${process.env.region}.amazonaws.com`, metadata: function (req, file, cb) { cb(null, { fieldName: file.fieldname }); }, key: function (req, file, cb) { cb(null, `${Date.now()}-img-${file.originalname}`); }, }), fileFilter: imageFilter, limits: { fieldSize: '50mb', }, });
原理:multer-s3在生成返回URL时,会依赖S3的endpoint配置。当没有显式指定时,它可能错误地将Bucket名重复拼接到URL前缀中。指定标准的区域S3 endpoint后,multer-s3就能正确生成包含单个Bucket名的合法URL。
内容的提问来源于stack exchange,提问作者Masood Ahmad
相关产品推荐
相关产品推荐

