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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:50:11