oss_file.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #!/usr/bin/python3.6
  2. # -*- coding: utf-8 -*-
  3. # @Author : lijunliang
  4. # @Email : lijunliang@topnet.net.cn
  5. # @File : law.py
  6. # @Software: PyCharm
  7. from itertools import islice
  8. import oss2
  9. import base64
  10. class OssServeClient(object):
  11. def __init__(self, access_key_id='LTAI4Fzf9BwiAxVm4NKnYai2',
  12. access_key_secret='qf4Ic6OItmQXoGyUgvIlQ2BojjrpaV',
  13. endpoint='oss-cn-beijing.aliyuncs.com',
  14. bucket_name='jydocs-previewimg'):
  15. """
  16. 抽象出来的文件存储客户端
  17. 目前使用阿里云OSS对象存储服务
  18. 如果更换SeaWeedFs,需要重写此文件
  19. 注意:文件读写,都是以object-name为索引,请保存object-name
  20. """
  21. self.__auth = None
  22. self.__bucket = None
  23. self.__access_key_id = access_key_id
  24. self.__access_key_secret = access_key_secret
  25. self.__endpoint = endpoint
  26. self.__bucket_name = bucket_name
  27. self.do_auth()
  28. def do_auth(self):
  29. """
  30. 身份验证,
  31. 注意:如果auth有时间限制,请在每一批次调用do_auth方法。
  32. """
  33. auth = oss2.Auth(self.__access_key_id, self.__access_key_secret)
  34. bucket = oss2.Bucket(auth, self.__endpoint, self.__bucket_name)
  35. self.__auth = auth
  36. self.__bucket = bucket
  37. def file_list(self):
  38. """
  39. 列举文件,仅测试用
  40. """
  41. for b in islice(oss2.ObjectIterator(self.__bucket), 10):
  42. obj = b.key
  43. print(obj)
  44. def upload_text_file(self, object_name: str, file_content: str, headers: dict = None) -> (any, any):
  45. """
  46. 文本内容上传
  47. :param object_name: url
  48. :param file_content: 文本内容
  49. :param headers: 自定义请求头
  50. :return:
  51. """
  52. result = self.__bucket.put_object(object_name, bytes(file_content, encoding='utf-8'), headers=headers)
  53. status, request_id = result.status, result.request_id
  54. return status, request_id
  55. def download_text_content(self, object_name) -> (bool, str):
  56. """
  57. 下载文本内容
  58. """
  59. object_stream = self.__bucket.get_object(object_name)
  60. content = object_stream.read()
  61. if object_stream.client_crc == object_stream.server_crc:
  62. return True, str(content, encoding='utf-8')
  63. else:
  64. return False, ''
  65. def delete_object(self, object_name: str) -> (any, any):
  66. """
  67. 删除内容
  68. """
  69. result = self.__bucket.delete_object(object_name)
  70. status, request_id = result.status, result.request_id
  71. return status, request_id
  72. def upload_bytes_file(self, object_name: str, file_content: bytes, headers: dict = None):
  73. """
  74. 文件上传
  75. :param object_name: fid
  76. :param file_content: 文件流
  77. :param headers: 自定义请求头
  78. :return:
  79. """
  80. if not headers:
  81. headers = None
  82. result = self.__bucket.put_object(object_name, file_content, headers=headers)
  83. status, request_id = result.status, result.request_id
  84. return status, request_id
  85. def download_file(self, object_name, save_path):
  86. """
  87. 文件下载到本地
  88. :param object_name: fid
  89. :param save_path: 保存路径
  90. :return:
  91. """
  92. object_stream = self.__bucket.get_object_to_file(object_name, save_path)
  93. if object_stream.status == 200:
  94. return True
  95. # @staticmethod
  96. # def create_oss_meta(request_field: dict):
  97. # '''
  98. # 生成请求头
  99. # :param request_field:
  100. # :return:
  101. # '''
  102. # header = {}
  103. # request_meta = {}
  104. # for key, val in request_field.items():
  105. # if not val:
  106. # continue
  107. # print(key,"------->",val)
  108. # request_meta += "{}:{},".format(key, base64.b64encode(val.encode("utf-8")))
  109. # # request_meta += "{}:{},".format(base64.b64encode(key.encode("utf-8")), base64.b64encode(val.encode("utf-8")))
  110. # # request_meta[key]= "{}".format(base64.b64encode(val.encode("utf-8")))
  111. # if request_meta:
  112. # header["x-oss-persistent-headers"] = request_meta
  113. # return header
  114. # return header
  115. @staticmethod
  116. def create_oss_meta(request_field: dict):
  117. '''
  118. 生成请求头
  119. :param request_field:
  120. :return:
  121. '''
  122. header = {}
  123. request_meta = "x-oss-meta-{}"
  124. for key, val in request_field.items():
  125. if val and key:
  126. h_k = request_meta.format(key)
  127. header[h_k] = base64.b64encode(val.encode("utf-8"))
  128. return header
  129. if __name__ == '__main__':
  130. fsc = OssServeClient()
  131. # fsc.file_list()
  132. # st = fsc.download_file("09b21fa4-87ba-11eb-aa22-00006052fe9a.docx",
  133. # "./123.docx")
  134. # st = fsc.download_file("8de27c64-87bd-11eb-a585-000060530480.pdf",
  135. # "./123.pdf")
  136. # st = fsc.download_file("cb38111c-8c43-11eb-84e3-0000605a9bb4.png",
  137. # "./456.png")
  138. # print(st)
  139. fsc.delete_object("0a163c54c1865a1e6af9f7e09daefce7.pdf")
  140. # ret = fsc.download_text_content("09b222e4-87ba-11eb-bd90-00006052fe9a")
  141. # print(ret)