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

使用AWS SDK for JavaScript v3 PutObjectCommand上传S3遇501 NotImplemented错误

Electron中使用AWS SDK上传S3报NotImplemented错误

我正尝试在Electron客户端中通过Node.js,使用以下代码将文件上传至S3存储桶:

const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');

const s3Client = new S3Client({
  region: 'eu-central-1',
  credentials: {
    accessKeyId: 'access',
    secretAccessKey: 'secret',
  },
});

const uploadFileToS3 = async (f) => {

  const bucketParams = {
    ACL: 'private',
    Bucket: 'bucket',
    Key: f.name,
    Body: f.data,
    ServerSideEncryption: 'AES256',
    ContentType: 'image/png',
  };

try {
    return await s3Client
      .send(new PutObjectCommand(bucketParams))
      .then((result) => {
        return process.send({
          type: 'success',
          fileName: f.name,
          result,
        });
      });
    } catch (error) {
        process.send({
         type: 'error',
         fileName: f.name,
         error: error,
    });
  }
};

process.on('message', (file) => {
    uploadFileToS3(file);
});

上传的文件是通过fs.readFileSync(pth)生成的Buffer,但收到如下错误:

error: {
    name: 'NotImplemented',
    '$fault': 'client',
    '$metadata': {
      httpStatusCode: 501,
      requestId: 'PXEBV6H4MX3',
      extendedRequestId: 'yyyyyy',
      attempts: 1,
      totalRetryDelay: 0
    },
    Code: 'NotImplemented',
    Header: 'Transfer-Encoding',
    RequestId: 'PXEBV6H4MX3',
    HostId: 'yyyyyy',
    message: 'A header you provided implies functionality that is not implemented'
  }

错误成因及解决方法

这个错误的核心原因是:传递给S3 SDK的Body并非原生Buffer实例,被识别为可读流后,SDK自动添加了S3 PutObject接口不支持的Transfer-Encoding: chunked请求头。

具体来说,你通过Electron的process.send传递文件数据时,原生Buffer会被序列化为普通JSON对象(结构类似{ type: 'Buffer', data: [...] }),而非真正的Buffer实例。AWS SDK在处理流类型的Body时,会默认使用分块传输编码,但S3的PutObject接口不支持这种编码方式,因此返回"NotImplemented"错误,错误信息中明确指出问题出在Transfer-Encoding头部。

解决办法:

  • 方法一:恢复Buffer实例
    在接收IPC消息的进程中,将序列化后的对象重新转换为原生Buffer:

    process.on('message', (file) => {
      // 把序列化的Buffer对象恢复为原生Buffer
      const restoredBuffer = Buffer.from(file.data);
      uploadFileToS3({ ...file, data: restoredBuffer });
    });
    
  • 方法二:使用Transfer传递Buffer
    利用Electron IPC的transfer选项传递Buffer,避免序列化操作:

    // 发送方示例(如渲染进程)
    ipcRenderer.send('upload-file', file, [file.data.buffer]);
    
    // 接收方示例(如主进程)
    ipcMain.on('upload-file', (event, file) => {
      uploadFileToS3(file);
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:45:35