python 阿里oss上传文件封装

import traceback
from datetime import datetime
from logging import getLogger

import oss2
from django.conf import settings
from rest_framework import status

logger = getLogger('sms')


class OSS:
    def __init__(self, connect_timeout: int = 30):
        """
        :param connect_timeout: 连接超时时间
        """
        self.base_url: str = settings.OSS_BASE_URL
        self.connect_timeout: int = connect_timeout
        self.space_prefix: str = settings.OSS_SPACE_PREFIX
        self.auth_kwargs: dict = dict(
            access_key_id=settings.OSS_ACCESS_KEY_ID,
            access_key_secret=settings.OSS_ACCESS_KEY_SECRET
        )
        self.auth = oss2.Auth(**self.auth_kwargs)
        self.bucket_kwargs: dict = dict(
            auth=self.auth,
            endpoint=settings.OSS_ENDPOINT,
            bucket_name=settings.OSS_BUCKET_NAME,
            connect_timeout=connect_timeout
        )
        self.bucket = oss2.Bucket(**self.bucket_kwargs)

    def upload(
            self,
            file: bytes,
            file_name: str,
            category: str,
            user_code: str
    ) -> str:
        """
        上传单个文件

        :param file: 文件
        :param file_name: 文件名称(用户输入的名称)
        :param category: 文件类型
        :param user_code: 用户唯一编码
        :return: 文件上传后的URL
        """
        upload_date: str = str(datetime.now())
        upload_path = f"{self.space_prefix}/{user_code}/{category}/{upload_date}/{file_name}"
        fixed_path: str = self.base_url + upload_path
        upload_kwargs: dict = dict(
            key=upload_path,
            data=file,
        )
        try:
            response = self.bucket.put_object(**upload_kwargs)
            if response.status == status.HTTP_200_OK:
                return fixed_path
            logger.error(traceback.format_exc())
            logger.info(f'OSS文件上传错误 状态:{response.status}')
            print(f'OSS文件上传错误 状态:{response.status}')
            return ''
        except Exception as e:
            logger.error(traceback.format_exc())
            logger.info(f'OSS文件上传错误:{e}')
            print(f'OSS文件上传错误:{e}')
            return ''


oss_client = OSS()

上一篇:自研网关纳管Spring Cloud(一)


下一篇:OSS 断点续传 分片上传 python 示例