| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | # -*- encoding: utf-8 -*-"""@File    : AmazonS3Util.py@Time    : 2022/8/11 14:00@Author  : stephen@Email   : zhangdongming@asj6.wecom.work@Software: PyCharm"""import loggingimport tracebackimport boto3import botocorefrom boto3.session import Sessionfrom botocore import clientfrom botocore.exceptions import ClientErrorlogger = logging.getLogger('info')class AmazonS3Util:    def __init__(self, aws_access_key_id, secret_access_key, region_name):        self.access_id = aws_access_key_id        self.access_secret = secret_access_key        self.region_name = region_name        session = Session(            aws_access_key_id=aws_access_key_id,            aws_secret_access_key=secret_access_key,            region_name=region_name        )        self.client_conn = boto3.client(            's3',            aws_access_key_id=aws_access_key_id,            aws_secret_access_key=secret_access_key,            config=botocore.client.Config(signature_version='s3v4'),            region_name=region_name        )        self.session_conn = session.resource('s3')    def upload_file_obj(self, bucket, file_key, file_obj, extra_args=None):        """        对象上传至S3存储桶        https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Object.upload_file        @param bucket: 存储桶名称-必须        @param file_key: 需要上传文件路径+文件名称        @param file_obj: 文件对象        @param extra_args: 额外参数 如ACL配置        @return: 当上传成功时为True;否则,False        """        try:            session = self.session_conn            bucket = session.Bucket(bucket)            obj = bucket.Object(file_key)            obj.upload_fileobj(file_obj, ExtraArgs=extra_args)            return True        except Exception as e:            print(e.args)            ex = traceback.format_exc()            print('具体错误{}'.format(ex))            return False    def generate_file_obj_url(self, bucket, file_key):        """        生成对象URL        https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.generate_presigned_url        @param bucket: 存储桶名称        @param file_key: 文件名称        @return: url        """        response_url = self.client_conn.generate_presigned_url(            ClientMethod='get_object',            Params={                'Bucket': bucket,                'Key': file_key            }        )        return response_url    def delete_obj(self, bucket, file_key):        """        删除对象        https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Object.delete        @param bucket: 存储桶        @param file_key: 文件名称        @return: 当删除成功时为True;否则,False        """        try:            bucket = self.session_conn.Bucket(bucket)            obj = bucket.Object(file_key)            obj.delete()            return True        except Exception as e:            print(e.args)            ex = traceback.format_exc()            print('具体错误{}'.format(ex))            return False    def bucket_exists(self, bucket_name):        """        判断桶是否存在,是否有访问权限        @return: 当bucket存在时为True;否则,假的        """        try:            self.client_conn.head_bucket(Bucket=bucket_name)            logger.info("存储桶 {} 存在.".format(bucket_name))            exists = True        except ClientError:            logger.warning(                "存储桶 {} 不存在,或者你没有权限.".format(bucket_name))            exists = False        return exists    def get_object(self, bucket, key):        """        获取对象        @param bucket: 存储桶        @param key: 文件        @return : boolean        """        try:            self.client_conn.get_object(Bucket=bucket, Key=key)            return True        except self.client_conn.exceptions.NoSuchKey:            return False    def download_object(self, bucket, key, file_name):        """        下载对象至本地        @param file_name: 保存位置以及名称        @param bucket: 存储桶        @param key: 文件        @return : boolean        """        try:            self.client_conn.download_file(bucket, key, file_name)            return True        except Exception as e:            return e.args    def copy_obj(self, source_bucket, to_bucket, file_key):        """        复制对象        @param source_bucket: 原存储桶        @param file_key: 文件名称        @param to_bucket: 新存储桶        """        source_dict = {            'Bucket': source_bucket,            'Key': file_key        }        self.session_conn.meta.client.copy(source_dict, to_bucket, file_key)
 |