Next.js项目使用CopyObjectCommand复制S3文件报错:Header未实现
问题
在Next.js项目中使用@aws-sdk/client-s3 v3.616.0的CopyObjectCommand复制S3文件时,出现错误:"A header you provided implies functionality that is not implemented"。但PutObjectCommand和DeleteObjectCommand均能正常工作。已尝试对Key和CopySource使用编码/非编码版本,甚至硬编码值,问题仍未解决。
实现代码:
// Copy S3 Object export const copyS3Object = (sourceKey, destinationKey ) => { try { const bucket = process.env.AWS_S3_BUCKET; const encodedSource = encodeURIComponent(`${bucket}/${sourceKey}`); const params = { Bucket: bucket, CopySource: encodedSource, Key: destinationKey, }; const command = new CopyObjectCommand(params); const data = await s3Client.send(command); return { status: 'success' }; } catch (error) { console.error("Error in copyS3Object:", error.message); console.error("Stack trace:", error.stack); throw new Error("Failed to copy S3 object"); } }, });
调用方式:
const newKey = `courses/${courseId}/${variant.name}/${variant.filename}`; const oldKey = `courses/temp/${variant.name}/${variant.filename}; await copyS3Object({ sourceKey: oldKey, destinationKey: newKey });
解决方案
1. 修复函数参数不匹配问题
你的copyS3Object函数定义接受两个独立参数sourceKey和destinationKey,但调用时传入的是一个包含这两个属性的对象,导致sourceKey实际是整个传入对象,destinationKey为undefined,直接造成参数错误。
修改函数定义为解构对象参数:
export const copyS3Object = ({ sourceKey, destinationKey }) => { try { const bucket = process.env.AWS_S3_BUCKET; const params = { Bucket: bucket, CopySource: `${bucket}/${sourceKey}`, Key: destinationKey, }; const command = new CopyObjectCommand(params); const data = await s3Client.send(command); return { status: 'success' }; } catch (error) { console.error("Error in copyS3Object:", error.message); console.error("Stack trace:", error.stack); throw new Error("Failed to copy S3 object"); } };
2. 移除CopySource的手动编码
AWS SDK v3会自动处理CopySource的URL编码,手动调用encodeURIComponent会引发双重编码,这是导致报错的核心原因。直接使用${bucket}/${sourceKey}格式的字符串即可。
3. 修复调用代码的语法错误
oldKey变量结尾缺少闭合的反引号,修正后:
const oldKey = `courses/temp/${variant.name}/${variant.filename}`;
验证修复后的调用
现在函数接收对象参数,调用方式无需调整,只需确保oldKey语法正确即可正常执行复制操作。
内容的提问来源于stack exchange,提问作者Kingsley Nyaosi
相关产品推荐
相关产品推荐

