kinit/kinit-api/utils/file/aliyun_oss.py
ktianc 7fbdcb3b0f 版本升级
1. 新增:微信小程序端新增微信手机号登录功能(必须为企业认证小程序)
2. 新增:加入动态更新常见问题
3. 新增:新增小程序分享功能
4. 新增:小程序新增第一次登录需要修改密码
5. 新增:新增接口权限控制
6. 新增:用户新增is_staff用来判断是否为工作人员
7. 新增:软删除新增is_delete字段来判断,delete_datetime当前主要来记录时间
8. 更新:部分接口删除功能已更新,需要试用软删除的才会试用软删除
9. 更新:更新系统配置缓存功能
10. 更新:接口认证依赖项更新
11. 更新:获取系统基础配置信息与用户协议与隐私协议更新
12. 优化:优化接口与数据库操作
2023-02-27 17:28:27 +08:00

91 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/python
# -*- coding: utf-8 -*-
# @version : 1.0
# @Creaet Time : 2022/4/28 22:32
# @File : aliyun_oss.py
# @IDE : PyCharm
# @desc : 阿里云对象存储
import os.path
from fastapi import UploadFile
from pydantic import BaseModel
import oss2 # 安装依赖库pip install oss2
from oss2.models import PutObjectResult
from core.logger import logger
from utils.file.compress.cpressJPG import compress_jpg_png
from utils.file.file_manage import FileManage
from utils.file.file_base import FileBase
class BucketConf(BaseModel):
accessKeyId: str
accessKeySecret: str
endpoint: str
bucket: str
baseUrl: str
class AliyunOSS(FileBase):
"""
阿里云对象存储
常见报错https://help.aliyun.com/document_detail/185228.htm?spm=a2c4g.11186623.0.0.6de530e5pxNK76#concept-1957777
官方文档https://help.aliyun.com/document_detail/32026.html
使用Python SDK时大部分操作都是通过oss2.Service和oss2.Bucket两个类进行。
oss2.Service类用于列举存储空间。
oss2.Bucket类用于上传、下载、删除文件以及对存储空间进行各种配置。
"""
def __init__(self, bucket: BucketConf):
# 阿里云账号AccessKey拥有所有API的访问权限风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维请登录RAM控制台创建RAM用户。
auth = oss2.Auth(bucket.accessKeyId, bucket.accessKeySecret)
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1杭州为例Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称。
self.bucket = oss2.Bucket(auth, bucket.endpoint, bucket.bucket)
self.baseUrl = bucket.baseUrl
async def upload_image(self, path: str, file: UploadFile, compress: bool = False) -> str:
"""
上传图片
:param path: path由包含文件后缀不包含Bucket名称组成的Object完整路径例如abc/efg/123.jpg。
:param file: 文件对象
:param compress: 是否压缩该文件
:return: 上传后的文件oss链接
"""
path = self.generate_path(path, file.filename)
if compress:
# 压缩图片
file_path = await FileManage.save_tmp_file(file)
new_file = compress_jpg_png(file_path, originpath=os.path.abspath(file_path))
with open(new_file, "rb") as f:
file_data = f.read()
else:
file_data = await file.read()
result = self.bucket.put_object(path, file_data)
assert isinstance(result, PutObjectResult)
if result.status != 200:
logger.error(f"图片上传到OSS失败状态码{result.status}")
print("图片上传路径", path)
print(f"图片上传到OSS失败状态码{result.status}")
return ""
return self.baseUrl + path
async def upload_file(self, path: str, file: UploadFile) -> str:
"""
上传文件
:param path: path由包含文件后缀不包含Bucket名称组成的Object完整路径例如abc/efg/123.jpg。
:param file: 文件对象
:return: 上传后的文件oss链接
"""
path = self.generate_path(path, file.filename)
file_data = await file.read()
result = self.bucket.put_object(path, file_data)
assert isinstance(result, PutObjectResult)
if result.status != 200:
logger.error(f"文件上传到OSS失败状态码{result.status}")
return ""
return self.baseUrl + path