AmazonS3Util.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : AmazonS3Util.py
  4. @Time : 2022/8/11 14:00
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import logging
  10. import traceback
  11. import boto3
  12. import botocore
  13. from boto3.session import Session
  14. from botocore import client
  15. from botocore.exceptions import ClientError
  16. logger = logging.getLogger('info')
  17. class AmazonS3Util:
  18. def __init__(self, aws_access_key_id, secret_access_key, region_name):
  19. self.access_id = aws_access_key_id
  20. self.access_secret = secret_access_key
  21. self.region_name = region_name
  22. session = Session(
  23. aws_access_key_id=aws_access_key_id,
  24. aws_secret_access_key=secret_access_key,
  25. region_name=region_name
  26. )
  27. self.client_conn = boto3.client(
  28. 's3',
  29. aws_access_key_id=aws_access_key_id,
  30. aws_secret_access_key=secret_access_key,
  31. config=botocore.client.Config(signature_version='s3v4'),
  32. region_name=region_name
  33. )
  34. self.session_conn = session.resource('s3')
  35. def upload_file_obj(self, bucket, file_key, file_obj, extra_args=None):
  36. """
  37. 对象上传至S3存储桶
  38. https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Object.upload_file
  39. @param bucket: 存储桶名称-必须
  40. @param file_key: 需要上传文件路径+文件名称
  41. @param file_obj: 文件对象
  42. @param extra_args: 额外参数 如ACL配置
  43. @return: 当上传成功时为True;否则,False
  44. """
  45. try:
  46. session = self.session_conn
  47. bucket = session.Bucket(bucket)
  48. obj = bucket.Object(file_key)
  49. obj.upload_fileobj(file_obj, ExtraArgs=extra_args)
  50. return True
  51. except Exception as e:
  52. print(e.args)
  53. ex = traceback.format_exc()
  54. print('具体错误{}'.format(ex))
  55. return False
  56. def generate_file_obj_url(self, bucket, file_key):
  57. """
  58. 生成对象URL
  59. https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.generate_presigned_url
  60. @param bucket: 存储桶名称
  61. @param file_key: 文件名称
  62. @return: url
  63. """
  64. response_url = self.client_conn.generate_presigned_url(
  65. ClientMethod='get_object',
  66. Params={
  67. 'Bucket': bucket,
  68. 'Key': file_key
  69. },
  70. ExpiresIn=3600
  71. )
  72. return response_url
  73. def delete_obj(self, bucket, file_key):
  74. """
  75. 删除对象
  76. https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Object.delete
  77. @param bucket: 存储桶
  78. @param file_key: 文件名称
  79. @return: 当删除成功时为True;否则,False
  80. """
  81. try:
  82. bucket = self.session_conn.Bucket(bucket)
  83. obj = bucket.Object(file_key)
  84. obj.delete()
  85. return True
  86. except Exception as e:
  87. print(e.args)
  88. ex = traceback.format_exc()
  89. print('具体错误{}'.format(ex))
  90. return False
  91. def bucket_exists(self, bucket_name):
  92. """
  93. 判断桶是否存在,是否有访问权限
  94. @return: 当bucket存在时为True;否则,假的
  95. """
  96. try:
  97. self.client_conn.head_bucket(Bucket=bucket_name)
  98. logger.info("存储桶 {} 存在.".format(bucket_name))
  99. exists = True
  100. except ClientError:
  101. logger.warning(
  102. "存储桶 {} 不存在,或者你没有权限.".format(bucket_name))
  103. exists = False
  104. return exists
  105. def get_object(self, bucket, key):
  106. """
  107. 获取对象
  108. @param bucket: 存储桶
  109. @param key: 文件
  110. @return : boolean
  111. """
  112. try:
  113. self.client_conn.get_object(Bucket=bucket, Key=key)
  114. return True
  115. except self.client_conn.exceptions.NoSuchKey:
  116. return False
  117. def copy_obj(self, source_bucket, to_bucket, file_key):
  118. """
  119. 复制对象
  120. @param source_bucket: 原存储桶
  121. @param file_key: 文件名称
  122. @param to_bucket: 新存储桶
  123. """
  124. source_dict = {
  125. 'Bucket': source_bucket,
  126. 'Key': file_key
  127. }
  128. self.session_conn.meta.client.copy(source_dict, to_bucket, file_key)