Object.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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 traceback
  10. import boto3
  11. import botocore
  12. from boto3.session import Session
  13. from botocore import client
  14. from botocore.exceptions import ClientError
  15. class AmazonS3Util:
  16. def __init__(self):
  17. self.access_id = 'AKIA2E67UIMD45Y3HL53'
  18. self.access_secret = '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'
  19. self.region_name = 'us-east-1'
  20. session = Session(
  21. aws_access_key_id=self.access_id,
  22. aws_secret_access_key=self.access_secret,
  23. region_name=self.region_name
  24. )
  25. self.client_conn = boto3.client(
  26. 's3',
  27. aws_access_key_id=self.access_id,
  28. aws_secret_access_key=self.access_secret,
  29. config=botocore.client.Config(signature_version='s3v4'),
  30. region_name=self.region_name
  31. )
  32. self.session_conn = session.resource('s3')
  33. def upload_file_obj(self, bucket, file_key, file_obj, extra_args=None):
  34. """
  35. 对象上传至S3存储桶
  36. https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Object.upload_file
  37. @param bucket: 存储桶名称-必须
  38. @param file_key: 需要上传文件路径+文件名称
  39. @param file_obj: 文件对象
  40. @param extra_args: 额外参数 如ACL配置
  41. @return: 当上传成功时为True;否则,False
  42. """
  43. try:
  44. session = self.session_conn
  45. bucket = session.Bucket(bucket)
  46. obj = bucket.Object(file_key)
  47. obj.upload_fileobj(file_obj, ExtraArgs=extra_args)
  48. return True
  49. except Exception as e:
  50. print(e.args)
  51. ex = traceback.format_exc()
  52. print('具体错误{}'.format(ex))
  53. return False
  54. def generate_file_obj_url(self, bucket, file_key):
  55. """
  56. 生成对象URL
  57. https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.generate_presigned_url
  58. @param bucket: 存储桶名称
  59. @param file_key: 文件名称
  60. @return: url
  61. """
  62. response_url = self.client_conn.generate_presigned_url(
  63. ClientMethod='get_object',
  64. Params={
  65. 'Bucket': bucket,
  66. 'Key': file_key
  67. }
  68. )
  69. return response_url
  70. def delete_obj(self, bucket, file_key):
  71. """
  72. 删除对象
  73. https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Object.delete
  74. @param bucket: 存储桶
  75. @param file_key: 文件名称
  76. @return: 当删除成功时为True;否则,False
  77. """
  78. try:
  79. bucket = self.session_conn.Bucket(bucket)
  80. obj = bucket.Object(file_key)
  81. obj.delete()
  82. return True
  83. except Exception as e:
  84. print(e.args)
  85. ex = traceback.format_exc()
  86. print('具体错误{}'.format(ex))
  87. return False
  88. def bucket_exists(self, bucket_name):
  89. """
  90. 判断桶是否存在,是否有访问权限
  91. @return: 当bucket存在时为True;否则,假的
  92. """
  93. try:
  94. self.client_conn.head_bucket(Bucket=bucket_name)
  95. exists = True
  96. except ClientError:
  97. exists = False
  98. return exists
  99. def get_object(self, bucket, key):
  100. """
  101. 获取对象
  102. @param bucket: 存储桶
  103. @param key: 文件
  104. @return : boolean
  105. """
  106. try:
  107. self.client_conn.get_object(Bucket=bucket, Key=key)
  108. return True
  109. except self.client_conn.exceptions.NoSuchKey:
  110. return False
  111. def download_object(self, bucket, key, file_name):
  112. """
  113. 下载对象至本地
  114. @param file_name: 保存位置以及名称
  115. @param bucket: 存储桶
  116. @param key: 文件
  117. @return : boolean
  118. """
  119. try:
  120. self.client_conn.download_file(bucket, key, file_name)
  121. return True
  122. except Exception as e:
  123. return e.args
  124. def copy_obj(self, source_bucket, to_bucket, file_key):
  125. """
  126. 复制对象
  127. @param source_bucket: 原存储桶
  128. @param file_key: 文件名称
  129. @param to_bucket: 新存储桶
  130. """
  131. source_dict = {
  132. 'Bucket': source_bucket,
  133. 'Key': file_key
  134. }
  135. self.session_conn.meta.client.copy(source_dict, to_bucket, file_key)
  136. def copy_single_obj(self, source_bucket, source_object, target_bucket, target_object, StorageClass=None):
  137. """
  138. 单个对象复制
  139. @param source_bucket:源存储桶
  140. @param source_object:源对象
  141. @param target_bucket:目标存储桶
  142. @param target_object:目标对象
  143. @param StorageClass:存储类
  144. @return: None
  145. """
  146. s3 = self.session_conn
  147. copy_source = {
  148. 'Bucket': source_bucket,
  149. 'Key': source_object
  150. }
  151. target_object = s3.Object(target_bucket, target_object)
  152. if StorageClass:
  153. target_object.copy_from(CopySource=copy_source, StorageClass=StorageClass)
  154. else:
  155. target_object.copy_from(CopySource=copy_source)
  156. def generate_put_obj_url(self, bucket_name, obj_key, storage_class=None):
  157. """
  158. 生成预签名对象URL
  159. @param bucket_name: 存储桶名称
  160. @param obj_key: 对象key
  161. @param storage_class: 存储类 例
  162. @return: 对象URL
  163. """
  164. params = {
  165. 'Bucket': bucket_name,
  166. 'Key': obj_key,
  167. }
  168. if storage_class:
  169. params['StorageClass'] = storage_class
  170. return self.session_conn.meta.client.generate_presigned_url('put_object',
  171. Params=params,
  172. ExpiresIn=7200)
  173. def batch_copy_obj(self, source_bucket, target_bucket, prefix, target_prefix, storage_class=None):
  174. """
  175. 批量拷贝对象
  176. @param source_bucket: 源存储桶
  177. @param target_bucket: 目标存储桶
  178. @param prefix: 需要搜索的对象前缀 例:AUS000247LTCLY/vod1/1686043996
  179. @param target_prefix: 目标对象前缀 例:app/algorithm-shop/1686043996
  180. @param storage_class: 存储类
  181. @return: None
  182. """
  183. s3 = self.session_conn
  184. # 遍历源存储桶中指定前缀下的所有对象,依次进行复制操作
  185. for obj in s3.Bucket(source_bucket).objects.filter(Prefix=prefix):
  186. key = obj.key # 对象键名
  187. target_key = f'{target_prefix}/' + key.split('/')[-1] # 新的对象键名,此处为 "new_path/" + 原有文件名
  188. copy_source = {
  189. 'Bucket': source_bucket,
  190. 'Key': key
  191. }
  192. # 将对象复制到目标存储桶,并设置存储类型和新的对象键名
  193. if storage_class:
  194. s3.Object(target_bucket, target_key).copy_from(CopySource=copy_source, StorageClass=storage_class)
  195. else:
  196. s3.Object(target_bucket, target_key).copy_from(CopySource=copy_source)
  197. def get_object_size(self, bucket_name, object_key):
  198. """
  199. 获取存储桶中指定对象的大小
  200. :param bucket_name: string,存储桶名称
  201. :param object_key: string,对象键名
  202. :return: int,指定对象的大小,单位为字节
  203. """
  204. s3 = self.session_conn
  205. obj = s3.Object(bucket_name, object_key)
  206. try:
  207. return obj.content_length
  208. except Exception as e:
  209. return 0
  210. def get_object_list(self, bucket_name, prefix):
  211. """
  212. 获取指定路径所有对象
  213. :param bucket_name: string,存储桶名称
  214. :param prefix: string,路径
  215. :return: int,指定对象的大小,单位为字节
  216. """
  217. try:
  218. s3 = self.client_conn
  219. obj = s3.list_objects_v2(Bucket=bucket_name, Prefix=prefix)
  220. return obj['Contents']
  221. except Exception as e:
  222. return []