oss2_util.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. import os
  2. import oss2
  3. from dw_base.utils.file_utils import get_abs_path
  4. class Readable:
  5. def read(self):
  6. pass
  7. class OssClient:
  8. """
  9. OSS术语
  10. English | 中文
  11. Bucket | 存储空间
  12. Object | 对象或者文件
  13. Endpoint | OSS 访问域名
  14. Region | 地域或者数据中心
  15. AccessKey | AccessKeyId 和 AccessKeySecret 的统称,访问密钥
  16. Put Object | 简单上传
  17. Post Object | 表单上传
  18. Multipart Upload | 分片上传
  19. Append Object | 追加上传
  20. Get Object | 简单下载
  21. | 回调
  22. Object Meta | 文件元信息。用来描述文件信息,例如长度,类型等
  23. Data | 文件数据
  24. Key | 文件名
  25. ACL (Access Control List)| 存储空间或者文件的权限
  26. """
  27. def __init__(self, access_key_id, access_key_secret, endpoint, bucket_name=None):
  28. """
  29. 提供操作OSS各种方法
  30. :param str access_key_id:
  31. :param str access_key_secret:
  32. :param str endpoint:
  33. :rtype: OssClient
  34. """
  35. self._access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', access_key_id)
  36. self._access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', access_key_secret)
  37. self._endpoint = os.getenv('OSS_TEST_ENDPOINT', endpoint)
  38. self._auth = oss2.Auth(self._access_key_id, self._access_key_secret)
  39. self._bucket_name = bucket_name
  40. if bucket_name:
  41. self._bucket = oss2.Bucket(self._auth, self._endpoint, bucket_name)
  42. # 创建一个Service对象
  43. self._service = oss2.Service(self._auth, self._endpoint)
  44. def list_buckets(self, prefix='', marker='', max_keys=100, params=None):
  45. """
  46. 根据前缀罗列用户的Bucket
  47. :param str prefix: 只罗列Bucket名为该前缀的Bucket,空串表示罗列所有的Bucket
  48. :param str marker: 分页标志。首次调用传空串,后续使用返回值中的next_marker
  49. :param int max_keys: 每次调用最多返回的Bucket数目
  50. :param dict params: list操作参数,传入'tag-key','tag-value'对结果进行过滤
  51. :return: 罗列的结果
  52. :rtype: oss2.models.ListBucketsResult
  53. """
  54. list_buckets_result = self._service.list_buckets(prefix, marker, max_keys, params)
  55. return list_buckets_result
  56. def get_bucket(self, bucket_name=None):
  57. """
  58. 获取bucket
  59. :param str bucket_name: bucket名称
  60. :return:
  61. :rtype: oss2.Bucket
  62. """
  63. assert bucket_name or self._bucket_name, 'need bucket name since default bucket is not provided'
  64. if bucket_name:
  65. return oss2.Bucket(self._auth, self._endpoint, bucket_name)
  66. return self._bucket
  67. def get_bucket_info(self, bucket_name=None):
  68. """
  69. 获取bucket相关信息,如创建时间,访问Endpoint,Owner与ACL等。
  70. :param str bucket_name: bucket名称
  71. :return:
  72. :rtype: oss2.models.GetBucketInfoResult
  73. """
  74. return self.get_bucket(bucket_name).get_bucket_info()
  75. def get_bucket_status(self, bucket_name=None):
  76. """
  77. 查看Bucket的状态,目前包括bucket大小,bucket的object数量,bucket正在上传的Multipart Upload事件个数等。
  78. :param str bucket_name: bucket名称
  79. :return:
  80. :rtype: oss2.models.GetBucketStatResult
  81. """
  82. return self.get_bucket(bucket_name).get_bucket_stat()
  83. def set_bucket_lifecycle(self, bucket_name=None, lifecycle_rule=None):
  84. """
  85. 设置bucket生命周期
  86. 例:
  87. # 设置bucket生命周期, 有'中文/'前缀的对象在最后修改时间之后357天失效
  88. rule = oss2.models.LifecycleRule('lc_for_chinese_prefix', '中文/', status=oss2.models.LifecycleRule.ENABLED,
  89. expiration=oss2.models.LifecycleExpiration(days=357))
  90. # 删除相对最后修改时间365天之后的parts
  91. rule.abort_multipart_upload = oss2.models.AbortMultipartUpload(days=356)
  92. # 对象最后修改时间超过180天后转为IA
  93. rule.storage_transitions = [oss2.models.StorageTransition(days=180, storage_class=oss2.BUCKET_STORAGE_CLASS_IA)]
  94. # 对象最后修改时间超过356天后转为ARCHIVE
  95. rule.storage_transitions.append(oss2.models.StorageTransition(days=356,
  96. storage_class=oss2.BUCKET_STORAGE_CLASS_ARCHIVE))
  97. lifecycle = oss2.models.BucketLifecycle([rule])
  98. :param str bucket_name: bucket名称
  99. :param oss2.models.BucketLifecycle lifecycle_rule: 生命周期
  100. :return:
  101. :rtype: oss2.models.RequestResult
  102. """
  103. assert not lifecycle_rule
  104. return self.get_bucket(bucket_name).put_bucket_lifecycle(lifecycle_rule)
  105. def upload_object(self, object_name, data, bucket_name=None, headers=None, progress_callback=None):
  106. """
  107. 上传一个普通文件
  108. :param str bucket_name: bucket名称
  109. :param str object_name: 要上传的对象名称
  110. :param bytes or str or Readable data: 要上传的数据(字节数组、字符串或file-like object——即含有read方法的对象)
  111. :param dict[str,any] or oss2.CaseInsensitiveDict headers:
  112. :param function progress_callback: 进度回调函数
  113. :return:
  114. :rtype: oss2.models.PutObjectResult
  115. """
  116. bucket = self.get_bucket(bucket_name)
  117. put_object_result = bucket.put_object(object_name, data, headers, progress_callback)
  118. return put_object_result
  119. def upload_object_from_file(self, filename, object_name=None, bucket_name=None, headers=None,
  120. progress_callback=None):
  121. """
  122. 上传一个普通文件
  123. 例:
  124. 1. upload('my-bucket','my-file1.txt','content of my-file1')
  125. 2. upload('my-bucket','my-file2.txt',b'content of my-file2')
  126. 3. with open(oss2.to_unicode('my-file3.txt'), 'rb') as f:
  127. upload('my-file3.txt', f)
  128. :param str bucket_name: bucket名称
  129. :param str filename: 要上传的文件名称
  130. :param str object_name: 上传到OSS后新的对象名称
  131. :param dict[str,any] or oss2.CaseInsensitiveDict headers:
  132. :param function progress_callback: 进度回调函数
  133. :return:
  134. :rtype: oss2.models.PutObjectResult
  135. """
  136. if not object_name:
  137. object_name = os.path.basename(filename)
  138. bucket = self.get_bucket(bucket_name)
  139. put_object_result = bucket.put_object_from_file(object_name, filename, headers, progress_callback)
  140. return put_object_result
  141. def download_object(self, bucket_object_name, local_object_name=None, bucket_name=None):
  142. """
  143. 下载一个文件到本地文件
  144. :param str bucket_name: bucket名称
  145. :param str bucket_object_name: bucket上的对象名称
  146. :param str local_object_name: 下载到本地后保存的对象名称
  147. :return:
  148. :rtype: oss2.models.GetObjectResult
  149. """
  150. bucket = self.get_bucket(bucket_name)
  151. if local_object_name and bucket_object_name != local_object_name:
  152. # 下载并修改文件名
  153. get_object_result = bucket.get_object_to_file(bucket_object_name, local_object_name)
  154. else:
  155. get_object_result = bucket.get_object_to_file(bucket_object_name, bucket_object_name)
  156. return get_object_result
  157. def delete_object(self, object_name, bucket_name=None):
  158. """
  159. 删除单个对象
  160. :param str bucket_name: bucket名称
  161. :param str object_name: 对象名称
  162. :return:
  163. :rtype: oss2.models.RequestResult
  164. """
  165. bucket = self.get_bucket(bucket_name)
  166. return bucket.delete_object(object_name)
  167. def delete_objects(self, objects_name, bucket_name=None):
  168. """
  169. 批量删除对象
  170. :param str bucket_name: bucket名称
  171. :param list[str] objects_name: 对象名称list
  172. :return:
  173. :rtype: oss2.models.BatchDeleteObjectsResult
  174. """
  175. bucket = self.get_bucket(bucket_name)
  176. return bucket.batch_delete_objects(objects_name)
  177. def get_object(self, object_name, bucket_name=None):
  178. """
  179. 获取一个对象
  180. :param str object_name: 对象名称
  181. :param str bucket_name: bucket名称
  182. :return:
  183. :rtype: oss2.models.GetObjectResult
  184. """
  185. bucket = self.get_bucket(bucket_name)
  186. return bucket.get_object(object_name)
  187. def get_object_meta(self, object_name, bucket_name=None):
  188. """
  189. 获取一个对象的详细信息
  190. :param str object_name: 对象名称
  191. :param str bucket_name: bucket名称
  192. :return:
  193. :rtype: oss2.models.GetObjectMetaResult
  194. """
  195. bucket = self.get_bucket(bucket_name)
  196. return bucket.get_object_meta(object_name)
  197. def list_objects(self, bucket_name=None):
  198. bucket = self.get_bucket(bucket_name)
  199. return bucket.list_objects()
  200. DEFAULT_ACCESS_KEY_ID = 'LTAI5t9oGbXWacakS4PJyQsR'
  201. DEFAULT_ACCESS_KEY_SECRET = 'BeuOP5zsavBtsR8fQ5QmrNyczdCW1Q'
  202. DEFAULT_ENDPOINT = 'oss-cn-qingdao-internal.aliyuncs.com'
  203. DEFAULT_BUCKET_NAME = 'skb-applogo'
  204. DEFAULT_DOWNLOAD_ADDRESS = f'https://skb-applogo.oss-cn-qingdao.aliyuncs.com'
  205. DEFAULT_OSS_CLIENT = OssClient(
  206. DEFAULT_ACCESS_KEY_ID,
  207. DEFAULT_ACCESS_KEY_SECRET,
  208. DEFAULT_ENDPOINT,
  209. DEFAULT_BUCKET_NAME
  210. )
  211. if __name__ == '__main__':
  212. DEFAULT_OSS_CLIENT.upload_object_from_file(get_abs_path('lib/gzrt-0.8.tar.gz'))