OCIObjectStorage.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : OCIObjectStorage.py
  4. @Time : 2024/4/10 15:06
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import oci
  10. from Ansjer.config import OCI_CONFIG, OCI_NAMESPACE_NAME
  11. class OCIObjectStorage:
  12. # Create a default oci_config using DEFAULT profile in default location
  13. # Refer to
  14. # https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm#SDK_and_CLI_Configuration_File
  15. # for more info
  16. def __init__(self, region):
  17. # Initialize service client with default oci_config file
  18. self.object_storage_client = oci.object_storage.ObjectStorageClient(OCI_CONFIG[region])
  19. def create_ereauthenticated_request(self, bucket_name, name, object_name, time_expires):
  20. """
  21. 创建特定于桶的预认证请求。
  22. api:https://docs.oracle.com/en-us/iaas/api/#/en/objectstorage/20160918/PreauthenticatedRequest/CreatePreauthenticatedRequest
  23. @param bucket_name: 存储桶名称
  24. @param name: 请求名称 是创建的预授权链接的名称,是方便管理用的,不会影响功能。比如对每个桶分别创建链接,如果要删除或者查看,可以根据name看出来是对哪个桶的链接。
  25. @param object_name: 对象名
  26. @param time_expires: 失效时间 需要datetime类型格式 例如:datetime.utcnow() + timedelta(minutes=30)
  27. @return: 预认证请求URL
  28. """
  29. try:
  30. object_storage_client = self.object_storage_client
  31. # Send the request to service, some parameters are not required, see API
  32. # doc for more info
  33. response = object_storage_client.create_preauthenticated_request(
  34. namespace_name=OCI_NAMESPACE_NAME,
  35. bucket_name=bucket_name,
  36. create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
  37. name=name,
  38. access_type="AnyObjectWrite",
  39. time_expires=time_expires,
  40. bucket_listing_action="Deny",
  41. object_name=object_name))
  42. assert response.status == 200
  43. return response.data
  44. except Exception as e:
  45. print(repr(e))
  46. return None
  47. def get_preauthenticated_request_url(self, bucket_name, name, object_name, time_expires, access_type='ObjectRead'):
  48. """
  49. 获取指定对象预认证请求URL。
  50. @param bucket_name: 存储桶名称
  51. @param name: 请求名称 是创建的预授权链接的名称,是方便管理用的,不会影响功能。比如对每个桶分别创建链接,如果要删除或者查看,可以根据name看出来是对哪个桶的链接。
  52. @param object_name: 对象名
  53. @param time_expires: 失效时间 需要datetime类型格式 例如:datetime.utcnow() + timedelta(minutes=30)
  54. @param access_type: 授权类型(https://docs.oracle.com/en-us/iaas/tools/python/2.127.0/api/object_storage/models/oci.
  55. object_storage.models.CreatePreauthenticatedRequestDetails.html#oci.object_storage.models.CreatePreauthenticatedRequestDetails.access_type)
  56. @return: 预认证请求URL
  57. """
  58. try:
  59. object_storage_client = self.object_storage_client
  60. # 创建预认证请求
  61. response = object_storage_client.create_preauthenticated_request(
  62. namespace_name=OCI_NAMESPACE_NAME,
  63. bucket_name=bucket_name,
  64. create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
  65. name=name,
  66. object_name=object_name,
  67. access_type=access_type,
  68. time_expires=time_expires
  69. )
  70. )
  71. assert response.status == 200
  72. return response.data
  73. except Exception as e:
  74. print(repr(e))
  75. return None
  76. def put_object(self, bucket_name, object_name, obj, content_type=None):
  77. """
  78. 上传对象
  79. @param bucket_name: 存储桶名称
  80. @param object_name: 对象名
  81. @param obj: 数据内容
  82. @param content_type: 文件类型
  83. @return: 可访问对象URL
  84. """
  85. try:
  86. object_storage_client = self.object_storage_client
  87. # 发送上传请求
  88. put_object_response = object_storage_client.put_object(
  89. namespace_name=OCI_NAMESPACE_NAME,
  90. bucket_name=bucket_name,
  91. object_name=object_name,
  92. put_object_body=obj,
  93. content_type=content_type
  94. )
  95. # 打印响应头信息
  96. assert put_object_response.status == 200
  97. except Exception as e:
  98. print(repr(e))
  99. return None
  100. def delete_object(self, bucket_name, object_name, content_type=None):
  101. """
  102. 删除对象
  103. @param bucket_name: 存储桶名称
  104. @param object_name: 对象名
  105. @param content_type: 文件类型
  106. @return: 可访问对象URL
  107. """
  108. try:
  109. object_storage_client = self.object_storage_client
  110. # 发送删除请求
  111. object_storage_client.delete_object(
  112. namespace_name=OCI_NAMESPACE_NAME,
  113. bucket_name=bucket_name,
  114. object_name=object_name)
  115. except Exception as e:
  116. print(repr(e))
  117. return None