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

