使用@aws-sdk/client-s3将图片上传到Amazon S3并获取其位置

3
我正在尝试将一张图片上传到S3,但是出现了以下错误信息:
ERROR: MethodNotAllowed: The specified method is not allowed against this resource.

我的代码使用@aws-sdk/client-s3包来上传,代码如下:

const s3 = new S3({
    region: 'us-east-1',
    credentials: {
        accessKeyId: config.accessKeyId,
        secretAccessKey: config.secretAccessKey,
    }
});

exports.uploadFile = async options => {
    options.internalPath = options.internalPath || (`${config.s3.internalPath + options.moduleName}/`);
    options.ACL = options.ACL || 'public-read';

    logger.info(`Uploading [${options.path}]`);
    const params = {
        Bucket: config.s3.bucket,
        Body: fs.createReadStream(options.path),
        Key: options.internalPath + options.fileName,
        ACL: options.ACL
    };

    try {
        const s3Response = await s3.completeMultipartUpload(params);
        if (s3Response) {
            logger.info(`Done uploading, uploaded to: ${s3Response.Location}`);
            return { url: s3Response.Location };
        }
    } catch (err) {
        logger.error(err, 'unable to upload:');
        throw err;
    }
};

我不确定这个错误的含义,一旦文件上传完成,我需要知道它在S3中的位置。

感谢任何帮助。

2个回答

3

看起来他们不再在响应中提供“位置”信息了。

{
'$metadata': {
  httpStatusCode: 200,
  requestId: '',
  extendedRequestId: '',
  cfId: ,
  attempts: 1,
  totalRetryDelay: 0
},
ETag: '',
ServerSideEncryption: ''
}

这是响应对象。

使用它来获取位置。

`https://${BUCKETNAME}.s3.${REGION}.amazonaws.com/${KEY}`

请确保 "ACL""public-read"


2

如果您需要上传单个图像文件,则需要调用s3.upload()而不是s3.completeMultipartUpload()

如果您有非常大的文件并希望分多个部分上传,则工作流程如下:

s3.createMultipartUpload()
s3.uploadPart()
s3.uploadPart()
...
s3.completeMultipartUpload()

看起来根据官方文档,在JavaScript SDK中进行简单的S3上传的新方法如下:
s3.send(new PutObjectCommand(uploadParams));

我看到了,当我尝试时它显示: “TypeError:s3.upload不是一个函数”我有什么遗漏吗? - spinker
这是 upload() 函数文档的链接:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#upload-property - Mark B
2
使用 aws-sdk 包可以工作,但是使用 @aws-sdk/client-s3 包时它没有上传功能。 - spinker
@spinker 请查看我的更新答案。 - Mark B
2
我看到它可以工作,现在唯一的问题是当我使用aws-sdk包时,我没有像以前一样得到response.Location - spinker
我会首先记录整个响应,我认为位置应该在响应中。 - Mark B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接