You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
5.1KB

  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. import cv2
  4. import oss2
  5. import time
  6. from loguru import logger
  7. '''
  8. 图片上传使用OSS
  9. 1. 阿里云对象存储OSS官网地址:https://help.aliyun.com/product/31815.html?spm=a2c4g.32006.0.0.8c546cf0BpkAQ2
  10. 2. 阿里云对象存储OSS SDK示例地址:https://help.aliyun.com/document_detail/32006.html?spm=a2c4g.32006.0.0.66874b78q1pwLa
  11. 3. python安装SDK地址: https://help.aliyun.com/document_detail/85288.html?spm=a2c4g.32026.0.0.3f24417coCphWj
  12. 4. 安装SDK: pip install oss2
  13. 5. 安装python-devel
  14. 安装python-devel
  15. 由于SDK需要crcmod库计算CRC校验码,而crcmod依赖Python.h文件,如果系统缺少这个头文件,安装SDK不会失败,但crcmod的C扩展模式安装会失败,因此导致上传、下载等操作效率非常低下。
  16. 如果python-devel包不存在,则首先要安装这个包。
  17. 对于Windows系统和Mac OS X系统,由于安装Python的时候会将Python依赖的头文件一并安装,因此您无需安装python-devel。
  18. 对于CentOS、RHEL、Fedora系统,请执行以下命令安装python-devel。
  19. sudo yum install python-devel
  20. 对于Debian,Ubuntu系统,请执行以下命令安装python-devel。
  21. sudo apt-get install python-dev
  22. 6、图片域名地址:https://image.t-aaron.com/
  23. '''
  24. class AliyunOssSdk:
  25. def __init__(self):
  26. self.__client = None
  27. self.__access_key = 'LTAI5tMiefafZ6br4zmrQWv9'
  28. self.__access_secret = 'JgzQjSCkwZ7lefZO6egOArw38YH1Tk'
  29. self.__endpoint = 'http://oss-cn-shanghai.aliyuncs.com'
  30. self.__bucket = 'ta-tech-image'
  31. def get_oss_bucket(self):
  32. if not self.__client:
  33. auth = oss2.Auth(self.__access_key, self.__access_secret)
  34. self.__client = oss2.Bucket(auth, self.__endpoint, self.__bucket, connect_timeout=30)
  35. def upload_file(self, updatePath, fileByte):
  36. logger.info("开始上传文件到oss!")
  37. MAX_RETRIES = 3
  38. retry_count = 0
  39. while True:
  40. try:
  41. self.get_oss_bucket()
  42. result = self.__client.put_object(updatePath, fileByte)
  43. return result
  44. logger.info("上传文件到oss成功!")
  45. break
  46. except Exception as e:
  47. self.__client = None
  48. retry_count += 1
  49. time.sleep(1)
  50. logger.info("上传文件到oss失败, 重试次数:{}", retry_count)
  51. if retry_count > MAX_RETRIES:
  52. logger.exception("上传文件到oss重试失败:{}", e)
  53. raise e
  54. YY_MM_DD_HH_MM_SS = "%Y-%m-%d %H:%M:%S"
  55. YMDHMSF = "%Y%m%d%H%M%S%f"
  56. def generate_timestamp():
  57. """根据当前时间获取时间戳,返回整数"""
  58. return int(time.time())
  59. def now_date_to_str(fmt=None):
  60. if fmt is None:
  61. fmt = YY_MM_DD_HH_MM_SS
  62. return datetime.datetime.now().strftime(fmt)
  63. if __name__ == "__main__":
  64. # 初始化oss对象
  65. ossClient = AliyunOssSdk()
  66. # 读取本地图片
  67. image_frame = cv2.imread('aaa.jpeg')
  68. or_result, or_image = cv2.imencode(".jpg", image_frame)
  69. # 图片名称命名规则
  70. # 1、base_dir 基本文件夹名称,由拓恒公司传参
  71. # 2、time_now 现在的时间
  72. # 3、current_frame 当前视频的帧数
  73. # 4、last_frame 如果有跳帧操作, 填写跳帧的步长,如果没有,和current_frame参数保持一致
  74. # 5、random_num 随机时间字符串
  75. # 6、mode_type 类型:实时视频直播的方式用(online) 离线视频直播(填写视频地址识别)用(offline)
  76. # 7、requestId 请求id, 拓恒公司传参
  77. # 8、image_type 原图用(OR) AI识别后的图片用(AI)
  78. random_num = now_date_to_str(YMDHMSF)
  79. time_now = now_date_to_str("%Y-%m-%d-%H-%M-%S")
  80. image_format = "{base_dir}/{time_now}_frame-{current_frame}-{last_frame}_type_{random_num}-{mode_type}-{base_dir}" \
  81. "-{requestId}_{image_type}.jpg"
  82. image_name = image_format.format(
  83. base_dir='PWL202304141639429276',
  84. time_now=time_now,
  85. current_frame='0',
  86. last_frame='0',
  87. random_num=random_num,
  88. mode_type='offline',
  89. requestId='111111111111111111',
  90. image_type='OR')
  91. result = ossClient.upload_file(image_name, or_image.tobytes())
  92. # print('http status: {0}'.format(result.status))
  93. # # 请求ID。请求ID是本次请求的唯一标识,强烈建议在程序日志中添加此参数。
  94. # print('request_id: {0}'.format(result.request_id))
  95. # # ETag是put_object方法返回值特有的属性,用于标识一个Object的内容。
  96. # print('ETag: {0}'.format(result.etag))
  97. # # HTTP响应头部。
  98. # print('date: {0}'.format(result.headers['date']))
  99. # print(result.__reduce__())
  100. # 对于图片上传, 上传成功后,直接将image_name给拓恒公司就可以了
  101. # 如果测试查看图片是否上传成功
  102. # 可以使用域名拼接
  103. image_url = 'https://image.t-aaron.com/' + image_name
  104. print(image_url)
  105. # 拓恒公司只需要image_name