前言
因为阿里云打折活动,所以买了一个oss存储的应用,这里是应用控制台
https://oss.console.aliyun.com/overview 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
关于它的应用,我认为和seafile的使用没有太大区别,二者互有高低(seafile提供了一套完整的用户管理、团队权限、系统界面设计,而oss属于底层基础设施,需要更多的开发,同时自定义化更高)
这里是阿里云oss的官方文档:
这里python的调用方案:
如何为OSS Python SDK配置访问凭证_对象存储(OSS)-阿里云帮助中心
个人感觉这个文档虽然全面,但还包含了一堆让人难解甚至给人引到坑里面的内容,这里我简要把API调用给讲明白。
安装和参数
虽然它让你去github去找SDK,实际上你用pip安装这个模块即可
pip install oss2
文档里我死活找不到模块需要的一些类似alibaba_cloud_access_key_id、endpoint之类的参数来源,因此我只能寻求搜索引擎并最终找到了它们的来源
你需要如下参数:
1、 alibaba_cloud_access
进入用户管理页面:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
创建一个用户或者点击用户超链接
alibaba_cloud_access_key_id和alibaba_cloud_access_key_secret就躺在这个地方
2、bucket、endpoint及region
bucket需要自己创建:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
endpoint及region:就是bucket的地域节点链接和地域代码
在这里看:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
这个链接就是endpoint:https://oss-cn-hangzhou.aliyuncs.com
region相当于这个链接的拆分的内容:cn-hangzhou
具体python调用
废话不多说直接上项目结构和代码:
bash
conf.ini
[global]
alibaba_cloud_access_key_id =XXXXXXXXXXXXXXXXXXXXXXXX
alibaba_cloud_access_key_secret =XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
endpoint =XXXXXXXXXXXXXXXXXXXX
region =XXXXXXXXXXXXXXXXXXXX
bucket_name=XXXXXXXXXX
python
demo.py
# -*- coding: utf-8 -*-
import os
import sys
import oss2
class AliOssControl:
def __init__(self, access_key_id, access_key_secret, endpoint, region, bucket_name):
# 使用获取的RAM用户的访问密钥配置访问凭证
auth = oss2.AuthV4(access_key_id, access_key_secret)
# 形成bucket对象
self.bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
# 获取bucket相关数据信息
def show_bucket(self):
# 获取Bucket相关信息。
bucket_info = self.bucket.get_bucket_info()
# 获取Bucket名称。
print('name: ' + bucket_info.name)
# 获取Bucket存储类型。
print('storage class: ' + bucket_info.storage_class)
# 获取Bucket创建时间。
print('creation date: ' + bucket_info.creation_date)
# 获取Bucket内网Endpoint。
print('intranet_endpoint: ' + bucket_info.intranet_endpoint)
# 获取Bucket外网Endpoint。
print('extranet_endpoint ' + bucket_info.extranet_endpoint)
# 获取拥有者信息。
print('owner: ' + bucket_info.owner.id)
# 获取Bucket读写权限ACL。
print('grant: ' + bucket_info.acl.grant)
# 获取容灾类型。
print('data_redundancy_type:' + bucket_info.data_redundancy_type)
# 获取Bucket的访问跟踪状态。仅Python SDK 2.16.1及以上版本支持获取访问跟踪状态。
print('access_monitor:' + bucket_info.access_monitor)
# 获取存储空间的统计信息。
result = self.bucket.get_bucket_stat()
# 获取Bucket的总存储量,单位为GB。
print('all_storage_size', round(result.storage_size_in_bytes / 1024 / 1024, 2), 'GB')
# 获取Bucket中总的Object数量。
print('all_object_num', result.object_count)
# 创建目录
def create_root(self, root_path):
self.bucket.put_object(f'{root_path}/', '')
# 清空并删除文件夹
def delete_root(self, root_path):
for obj in oss2.ObjectIterator(self.bucket, prefix=root_path):
self.bucket.delete_object(obj.key)
# 上传文件
def upload_file(self, save_path, file_path=None):
# 必须以二进制的方式打开文件。
# 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
with open(save_path, 'rb') as fileobj:
content = fileobj.read()
# 填写Object完整路径。Object完整路径中不能包含Bucket名称。
if file_path:
file_name = file_path
else:
file_name = os.path.basename(save_path)
# 不指定x-oss-forbid-overwrite时,默认覆盖同名Object。
# 指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。
# 指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在,程序将报错。
headers = {'x-oss-forbid-overwrite': 'true'}
try:
self.bucket.put_object(file_name, content, headers=headers)
return True
except Exception as e:
print(e)
return False
# 展示目录文件列表
def show_file_list(self, root_path=None):
objs = []
if root_path:
for obj in oss2.ObjectIterator(self.bucket, prefix=root_path):
objs.append(obj.key)
else:
# 列举Bucket下的所有文件。
for obj in oss2.ObjectIterator(self.bucket):
objs.append(obj.key)
return objs
# 文件存在检查
def exist_file(self, file_path):
exist = self.bucket.object_exists(file_path)
# 返回值为true表示文件存在,false表示文件不存在。
if exist:
return True
else:
return False
# 含进度条的文件本地下载功能
def download_file(self, file_path, save_path):
def percentage(consumed_bytes, total_bytes):
if total_bytes:
rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
# rate表示下载进度。
print('\r{0}% '.format(rate), end='')
sys.stdout.flush()
# progress_callback是可选参数,用于实现进度条功能。
self.bucket.get_object_to_file(file_path, save_path, progress_callback=percentage)
# 拉取文件stream流
def pull_file_stream(self, file_path):
object_stream = self.bucket.get_object(file_path)
return object_stream
# 删除文件
def delete_file(self, file_path):
self.bucket.delete_object(file_path)
#
if __name__ == '__main__':
import configparser
# 读取配置文件
config = configparser.ConfigParser()
# 假设config.ini位于脚本同级目录下
config.read('conf.ini')
# 从配置文件中获取Access Key ID和Access Key Secret
global_conf = config['global']
access_key_id = global_conf['alibaba_cloud_access_key_id']
access_key_secret = global_conf['alibaba_cloud_access_key_secret']
endpoint = global_conf['endpoint']
region = global_conf['region']
bucket_name = global_conf['bucket_name']
ali_oss = AliOssControl(access_key_id, access_key_secret, endpoint, region, bucket_name)
# 展示bucket信息
ali_oss.show_bucket()
"""
文件操作
"""
# # 文件上传
# upload_status = ali_oss.upload_file(save_path='appendix/花枝鼠1.webp')
# print('upload', upload_status)
#
# # 展示根目录存储内容
# file_saves = ali_oss.show_file_list(root_path='')
# print('file_saves:', len(file_saves), file_saves)
#
# # 检验文件是否存在
# exist_status = ali_oss.exist_file('花枝鼠1.webp')
# print(exist_status)
#
# if exist_status:
# # 下载文件至本地地址
# ali_oss.download_file('花枝鼠1.webp', 'download/1.webp')
#
# # 流式下载,可用于将之作为文件传输的中间件
# file_seek = ali_oss.pull_file_stream('花枝鼠1.webp')
# with open('download/2.webp', 'wb') as f:
# f.write(file_seek.read())
"""
目录操作
"""
# # 创建目录
# ali_oss.create_root('home')
#
# # 上传文件
# upload_status = ali_oss.upload_file(save_path='appendix/花枝鼠1.webp', file_path='home/3.webp')
# print('upload', upload_status)
#
# # 展示该目录下的内容
# file_saves = ali_oss.show_file_list(root_path='home/')
# print('file_saves:', len(file_saves), file_saves)
#
# # 全量删除目录下的文件
# ali_oss.delete_root('home')