使用python连接雨云对象存储(基于S3协议的对象存储的实践)

1. 前言

以下内容引用自雨云官方文档:

有时候我们需要使用代码控制使用对象存储,比如上传、下载文件等。如需要使用Python控制对象存储,我们可以使用Boto3框架操作。有关更多Boto3框架的操作可以参考AWS SDK for Python (Boto3)

首先我们需要在Python项目安装并引入bob3包:

pip install boto3

然后我们可以使用以下代码来连接到对象存储:

        import boto3
        endpoint_url = 'https://cn-sy1.rains3.com'
        access_key = '填入雨云对象存储的AccessKey'
        secret_key = '填入雨云对象存储的SecretKey'
        
        s3 = boto3.client('s3',
                          endpoint_url=endpoint_url,
                          aws_access_key_id=access_key,
                          aws_secret_access_key=secret_key)
        #列出所有的存储桶名
        responses = s3.list_buckets()
        buckets = [bucket['Name'] for bucket in responses['Buckets']]
        print(buckets)

配置好对象存储的key后,直接运行代码,如果配置正确并且网络通畅,你将会看到输出的存储桶名。如下:

['yemengstar','yemengtest']

有时候我们需要生成一个预签名URL,用于临时授权访问对象存储中的文件。我们可以使用以下代码来生成预签名URL(在上面的代码后面直接添加):


url =  s3.generate_presigned_url( ClientMethod='get_object',
    Params={
        'Bucket': '存储桶名',
        'Key': '文件路径'
    },
    ExpiresIn=3600#链接有效时间,单位秒
)
print(url)

夜梦使用自己的桶(yemengtest)和文件路径(test_folder)运行后得到如下格式的链接:

https://cn-sy1.rains3.com/yemengtest/test_folder?AWSAccessKeyId=key&Signature=6%3D&Expires=12345678

2. 实践

归根结底雨云ROS使用的是S3协议,我们只需要借助boto3就可以完成雨云对象存储(ROS)的基础操作了,例如上传图片、文件到指定文件夹指定路径中。

单个文件的上传可以使用下面的代码实现(仅作示例,完整代码夜梦在GitHub开源,小伙伴们可以去查看)

        def per_file_update(filename, seen, size, percent):
            # update overall uploaded bytes and progress bar incrementally
            # We compute delta and add to global uploaded bytes
            # For simplicity, we update progress bar to (uploaded_bytes + seen_of_current) / total
            try:
                # Not thread-safe perfect accuracy — fine for UI approximate progress
                self._last_seen = getattr(self, '_last_seen', {})
                last = self._last_seen.get(filename, 0)
                delta = seen - last
                self._last_seen[filename] = seen
                self._uploaded_bytes += delta
                overall_pct = (self._uploaded_bytes / self._total_bytes) * 100 if self._total_bytes else 0
                self.progress_bar['value'] = overall_pct
            except Exception:
                pass

        cb = ProgressPercentage(path, filesize, per_file_update)

运行界面:

endpoint URL即为API 端点,根据你存储的位置进行填写https://cn-nb1.rains3.com或者https://cn-sy1.rains3.com。

base public url可以空着。

bucket即为存储桶名,如果你要存到名为a的桶,即填写a。

prefix即为存储路径,比如你要存到a存储桶中upload文件夹,那么就填写upload。

access key和secret key填写对象存储实例的!即界面如下的访问凭证信息:

填写完成后,点击test connection测试连接性。如果一切顺利,会提示找到桶。

然后我们就可以添加文件上传了:

上传成功后,会自动复制链接到剪切板,如果需要访问,在开启存储示例与存储桶的公共访问后,既可在浏览器中直接访问。

GitHub地址:yemengstar/rainyun_object_storage: 上传图像至雨云对象存储。

本文为夜梦星尘原创文章。
文章作者:夜梦星尘
文章链接:使用python连接雨云对象存储(基于S3协议的对象存储的实践)
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自夜梦星尘
支持作者:夜梦星尘的爱发电
上一篇