使用AWS S3 PythonSDK连接私有S3节点

AWS 提供多语言SDK连接S3存储服务,本文主要描述使用pythonSDK连接私有S3节点

# _*_ coding: utf-8 _*_
import os

from boto3.session import Session
from botocore.exceptions import ClientError

from Common.tools.logger import Logger

logger = Logger(logger=__name__).getlog()


class Boto3Client:
    def __init__(self, access_key, secret_key, url, source=False):
        """
        access_key = "xxx"
        secret_key = "xxx"
        url = "https://s3.ap-east-1.amazonaws.com"  # 也可以是自己节点的地址
        """
        self.access_key = access_key
        self.secret_key = secret_key
        self.url = url
        self.source = source
        if self.source:
            self.url = "https://" + url
        else:
            self.url = "http://" + url
        session = Session(self.access_key, self.secret_key)
        self.s3_client = session.client('s3', endpoint_url=self.url)
        self.s3 = session.resource('s3', endpoint_url=self.url)
        # self.urlR = url

    def make_bucket(self, bucketName):
        self.s3_client.create_bucket(Bucket=bucketName)
        return bucketName

    def existed_bucket(self, bucketName):
        try:
            self.s3_client.meta.client.head_bucket(Bucket=bucketName)
        except ClientError:
            return False
        return True

    def remove_bucket(self, bucketName):
        return self.s3_client.delete_bucket(Bucket=bucketName)

    def list_buckets(self):
        res = self.s3_client.list_buckets()
        logger.debug(res)
        return [i['Name'] for i in res['Buckets']]

    def put_object(self, bucketName, file, objectName=None):
        if objectName is None:
            objectName=file.split('/')[-1]
        with open (file,'rb')as f:
            res = self.s3_client.put_object(
                Body=f,
                Bucket=bucketName,
                Key=objectName
            )
            logger.debug(f'put object:{res}')
            return objectName

    def list_objects(self, bucketName):
        res = self.s3_client.list_objects(Bucket=bucketName)
        if 'Contents' not in res:
            return []
        else:
            return [i['Key'] for i in res['Contents']]

    def list_object_v2(self, bucketName):
        res = self.s3_client.list_objects_v2(Bucket=bucketName)
        return [i['Key'] for i in res['Contents']]

    def get_object(self, bucket_name, object_name, file_name):
        self.s3_client.download_file(bucket_name, object_name, file_name)
        return os.path.abspath(file_name)

    def delete_obj(self, bucket_name, object_name):
        res = self.s3_client.delete_object(
            Bucket=bucket_name,
            Key=object_name,
        )
        return res

    def get_bucket_location(self, bucket_name):
        location_info = self.s3_client.get_bucket_location(Bucket=bucket_name)
        logger.debug(f'location_info:{location_info}')
        return location_info['LocationConstraint']

    def head_bucket(self, bucket_name):
        resp = self.s3_client.head_bucket(Bucket=bucket_name)
        resp['ResponseMetadata']['HTTPHeaders']['x-amz-request-id'] = 0
        resp['ResponseMetadata']['HTTPHeaders']['date'] = 0
        resp['ResponseMetadata']['RequestId'] = 0
        return resp

    def head_object(self, bucket_name, object_name):
        return self.s3_client.head_object(
            Bucket=bucket_name,
            Key=object_name,
        )

    def get_bucket_acl(self, bucket_name):
        resp = self.s3_client.get_bucket_acl(Bucket=bucket_name)
        resp['ResponseMetadata']['HTTPHeaders']['x-amz-request-id'] = 0
        resp['ResponseMetadata']['RequestId'] = 0
        return resp

    def get_object_acl(self, bucket_name, object_name):
        resp = self.s3_client.get_object_acl(Bucket=bucket_name, Key=object_name)
        resp['ResponseMetadata']['HTTPHeaders']['x-amz-request-id'] = 0
        resp['ResponseMetadata']['RequestId'] = 0
        return resp

    def put_object_Acl(self, bucket_name, object_name, Permission='FULL_CONTROL'):
        """Permission:'FULL_CONTROL'|'WRITE'|'WRITE_ACP'|'READ'|'READ_ACP'"""
        return self.s3_client.put_object_acl(
            ACL='private',
            AccessControlPolicy={
                'Grants': [
                    {
                        'Grantee': {
                            'DisplayName': 'string',
                            'EmailAddress': 'string',
                            'ID': 'string',
                            'Type': 'CanonicalUser',
                            'URI': 'string'
                        },
                        'Permission': Permission
                    },
                ],
                'Owner': {
                    'DisplayName': 'string',
                    'ID': 'string'
                }
            },
            Bucket=bucket_name,
            GrantFullControl='string',
            GrantRead='string',
            GrantReadACP='string',
            GrantWrite='string',
            GrantWriteACP='string',
            Key=object_name,
            RequestPayer='requester',
            VersionId='string',
            ExpectedBucketOwner='string'
        )

    def create_multipart_upload(self, bucket_name, object_name):
        return self.s3_client.create_multipart_upload(Bucket=bucket_name, Key=object_name)['UploadId']

    def complete_multipart_upload(self, bucket_name, object_name, upload_id, part: list):
        # part : 传 Parts结构
        """[
            {
                'ETag': file_md5,
                'PartNumber': part_nums
            },
            ...
            ]"""
        return self.s3_client.complete_multipart_upload(
            Bucket=bucket_name,
            Key=object_name,
            UploadId=upload_id,
            MultipartUpload={
                'Parts': part
            },
        )

    def upload_part(self, fileIO, bucket_name, object_name, part_num: int, upload_id):
        return self.s3_client.upload_part(
            Body=fileIO,
            Bucket=bucket_name,
            Key=object_name,
            PartNumber=part_num,
            UploadId=upload_id
        )

    def clearAll(self):
        logger.debug('start clear')
        buckets = self.list_buckets()
        for i in buckets:
            logger.debug(f'bucket:{i}')
            for j in self.list_objects(bucketName=i):
                logger.debug('bucket:{} \t object:{}'.format(i, j))
                self.delete_obj(i, j)
            self.remove_bucket(i)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试小胖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值