python源码:阿里云OSS存储API调用

前言

因为阿里云打折活动,所以买了一个oss存储的应用,这里是应用控制台

https://oss.console.aliyun.com/overview 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

关于它的应用,我认为和seafile的使用没有太大区别,二者互有高低(seafile提供了一套完整的用户管理、团队权限、系统界面设计,而oss属于底层基础设施,需要更多的开发,同时自定义化更高)

这里是阿里云oss的官方文档:

什么是对象存储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')
相关推荐
牛顿喜欢吃苹果7 分钟前
linux创建虚拟串口
python
团儿.14 分钟前
Docker服务发现新纪元:探索Consul的无限魅力
运维·docker·云计算·服务发现·consul
-Mr_X-14 分钟前
FFmpeg在python里推流被处理过的视频流
python·ffmpeg
一个不秃头的 程序员30 分钟前
代码加入SFTP JAVA ---(小白篇3)
java·python·github
susu108301891135 分钟前
python实现根据搜索关键词爬取某宝商品信息
爬虫·python
喜欢猪猪1 小时前
Java技术专家视角解读:SQL优化与批处理在大数据处理中的应用及原理
android·python·adb
海绵波波1071 小时前
flask后端开发(1):第一个Flask项目
后端·python·flask
林的快手1 小时前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
从以前1 小时前
准备考试:解决大学入学考试问题
数据结构·python·算法
Ven%2 小时前
如何修改pip全局缓存位置和全局安装包存放路径
人工智能·python·深度学习·缓存·自然语言处理·pip