首页 > 解决方案 > 使用签名 URL 上传到 Amazon S3

问题描述

我正在实现将由 Angular 应用程序使用的文件上传功能。但是我在让它工作时遇到了很多问题。并且需要帮助弄清楚我错过了什么。以下是现有资源的概述,以及我得到的测试和结果。

基础设施

    def generate_upload_url(self):
        try:
            conditions = [
                {"acl": "private"},
                ["starts-with", "$Content-Type", ""]
            ]
            fields = {"acl": "private"}
            response = self.s3.generate_presigned_post(self.bucket_name,
                                                       self.file_path,
                                                       Fields=fields,
                                                       Conditions=conditions,
                                                       ExpiresIn=3600)
        except ClientError as e:
            logging.error(e)
            return None
        return response

    def construct_file_names(self):
        self.file_path = self.account_number + '-' + self.user_id + '-' + self.experiment_id + '-experiment-data.json'
        self.bucket_name = self.account_number + '-' + self.user_id + '-resources'

通过 Postman 进行测试

在我的角度应用程序中实现它之前。我正在通过 Postman 测试上传功能。

在此处输入图像描述

在此处输入图像描述

如果有人能看到我在这里可能做错了什么。我在 boto3 方法中使用了不同的字段,但最终,我收到了 403 错误,其中包含与策略条件相关的不同消息。任何帮助,将不胜感激。

更新 1

在此处输入图像描述

更新二 - 使用签名 v4

def upload_data(x):
    try:
        config = Config(
            signature_version='s3v4',
        )
        s3 = boto3.client('s3', "eu-west-1", config=config)
        sts = boto3.client('sts', "eu-west-1")
        data_upload = UploadData(x["userId"], x["experimentId"], s3, sts)
        return data_upload.generate_upload_url()
    except Exception as e:
        logging.error(e)


在此处输入图像描述

在此处输入图像描述

再次出现错误,但我认为我正在朝着正确的方向前进。

标签: amazon-web-servicesamazon-s3file-uploadpostman

解决方案


尝试在该行acl上方移动。file确保file在最后。


推荐阅读