本源码包含使用Python对UCloud的对象存储业务(UFile)进行空间和内容管理的API,适用于Python 2(2.6及以后)和Python 3(3.3及以后)
在对象存储系统中,存储空间(Bucket)是文件(File)的组织管理单位,文件(File)是存储空间的逻辑存储单元。对于每个账号,该账号里存放的每个文件都有唯一的一对存储空间(Bucket)与键(Key)作为标识。我们可以把 Bucket 理解成一类文件的集合,Key 理解成文件名。由于每个 Bucket 需要配置和权限不同,每个账户里面会有多个 Bucket。在 UFile 里面,Bucket 主要分为公有和私有两种,公有 Bucket 里面的文件可以对任何人开放,私有 Bucket 需要配置对应访问签名才能访问。
- requests
- docs文件夹: 开发文档生成文件
- ufile文件夹: SDK的具体实现
- setup.py: package安装文件
- test_ufile文件夹: 测试文件以及demo示例
python setup.py install
(本地安装)
pip install ufile
(pip安装,须首先安装pip)
注意:在国内的 pip 源会由于网络问题无法更新,建议加上国内的 python 源。 具体请见:如何添加 python 国内源?
docs文件夹包含基于sphinx的开发文档生成文件,在此文件夹下可通过运行make html命令可生成build目录,build/html目录即为开发文档
ufile文件夹包含SDK的具体实现,该文件夹亦是名为ufile的package的源码文件夹
public_key = '' #账户公私钥中的公钥
private_key = '' #账户公私钥中的私钥
from ufile import config
#设置上传host后缀,外网可用后缀形如 .cn-bj.ufileos.com(cn-bj为北京地区,其他地区具体后缀可见控制台:对象存储-单地域空间管理-存储空间域名)
config.set_default(uploadsuffix='YOUR_UPLOAD_SUFFIX')
#设置下载host后缀,普通下载后缀即上传后缀,CDN下载后缀为 .ufile.ucloud.com.cn
config.set_default(downloadsuffix='YOUR_DOWNLOAD_SUFFIX')
#设置请求连接超时时间,单位为秒
config.set_default(connection_timeout=60)
#设置私有bucket下载链接有效期,单位为秒
config.set_default(expires=60)
from ufile import logger
locallogname = '' #完整本地日志文件名
logger.set_log_file(locallogname)
- demo 程序
public_bucket = '' #公共空间名称
private_bucket = '' #私有空间名称
localfile = '' #本地文件名
put_key = '' #上传文件在空间中的名称
from ufile import filemanager
putufile_handler = filemanager.FileManager(public_key, private_key)
# 普通上传文件至公共空间
ret, resp = putufile_handler.putfile(public_bucket, put_key, localfile, header=None)
assert rest.status_code == 200
# 普通上传文件至私有空间
ret, resp = putufile_handler.putfile(private_bucket, put_key, localfile, header=None)
assert resp.status_code == 200
# 普通上传二进制数据流至公共空间
from io import BytesIO
bio = BytesIO(u'Do be a good man'.encode('utf-8')) #二进制数据流
stream_key = '' #上传数据流在空间中的名称
ret, resp = putufile_handler.putfile(public_bucket, stream_key, bio)
- HTTP 返回状态码
状态码 | 描述 |
---|---|
200 | 文件或者数据上传成功 |
400 | 上传到不存在的空间 |
403 | API公私钥错误 |
401 | 上传凭证错误 |
- demo程序
public_bucket = '' #公共空间名称
private_bucket = '' #私有空间名称
localfile = '' #本地文件名
post_key = '' #上传文件在空间中的名称
from ufile import filemanager
postufile_handler = filemanager.FileManager(public_key, private_key)
# 表单上传至公共空间
ret, resp = postufile_handler.postfile(public_bucket, post_key, localfile)
assert resp.status_code == 200
# 表单上传至私有空间
ret, resp = postufile_handler.postfile(private_bucket, post_key, localfile)
assert resp.status_code == 200
- HTTP 返回状态码
状态码 | 描述 |
---|---|
200 | 文件或者数据上传成功 |
400 | 上传到不存在的空间 |
403 | API公私钥错误 |
401 | 上传凭证错误 |
- demo程序
public_bucket = '' #公共空间名称
existkey = '' #添加上传文件在空间中的名称
nonexistkey = '' #添加上传文件在空间中的名称
existfile = '' #本地文件名(空间存在该文件)
nonexistfile = '' #本地文件名((空间不存在该文件))
from ufile import filemanager
uploadhitufile_handler = filemanager.FileManager(public_key, private_key)
# 秒传已存在文件
ret, resp = uploadhitufile_handler.uploadhit(public_bucket, existkey, existfile)
assert resp.status_code == 200
# 秒传不存在文件
ret, resp = uploadhitufile_handler.uploadhit(public_bucket, nonexistkey, nonexistfile)
assert resp.status_code == 404
- HTTP 状态返回码
状态码 | 描述 |
---|---|
200 | 文件秒传成功 |
400 | 上传到不存在的空间 |
403 | API公私钥错误 |
401 | 上传凭证错误 |
404 | 文件秒传失败 |
- demo程序
public_bucket = '' #公共空间名称
private_bucket = '' #私有空间名称
public_savefile = '' #保存文件名
private_savefile = '' #保存文件名
range_savefile = '' #保存文件名
put_key = '' #文件在空间中的名称
stream_key = '' #文件在空间中的名称
from ufile import filemanager
downloadufile_handler = filemanager.FileManager(public_key, private_key)
# 从公共空间下载文件
ret, resp = downloadufile_handler.download_file(public_bucket, put_key, public_download, isprivate=False)
assert resp.status_code == 200
# 从私有空间下载文件
ret, resp = downloadufile_handler.download_file(private_bucket, put_key, private_download)
assert resp.status_code == 200
# 下载包含文件范围请求的文件
ret, resp = downloadufile_handler.download_file(public_bucket, put_key, range_savefile, isprivate=False, expires=300, content_range=(0, 15))
assert resp.status_code == 206
- HTTP 返回状态码
状态码 | 描述 |
---|---|
200 | 文件或者数据下载成功 |
206 | 文件或者数据范围下载成功 |
400 | 不存在的空间 |
403 | API公私钥错误 |
401 | 下载签名错误 |
404 | 下载文件或数据不存在 |
416 | 文件范围请求不合法 |
- demo程序
public_bucket = '' #公共空间名称
private_bucekt = '' #私有空间名称
delete_key = '' #文件在空间中的名称
from ufile import filemanager
deleteufile_handler = filemanager.FileManager(public_key, private_key)
# 删除公共空间的文件
ret, resp = deleteufile_handler.deletefile(public_bucket, delete_key)
assert resp.status_code == 204
# 删除私有空间的文件
ret, resp = deleteufile_handler.deletefile(private_bucket, delete_key)
assert resp.status_code == 204
- HTTP 返回状态码
状态码 | 描述 |
---|---|
204 | 文件或者数据删除成功 |
403 | API公私钥错误 |
401 | 签名错误 |
- demo程序
public_bucket = '' #公共空间名称
sharding_key = '' #上传文件在空间中的名称
localfile = '' #本地文件名
from ufile import multipartuploadufile
multipartuploadufile_handler = multipartuploadufile.MultipartUploadUFile(public_key, private_key)
# 分片上传一个全新的文件
ret, resp = multipartuploadufile_handler.uploadfile(public_bucket, sharding_key, localfile)
while True:
if resp.status_code == 200: # 分片上传成功
break
elif resp.status_code == -1: # 网络连接问题,续传
ret, resp = multipartuploadufile_handler.resumeuploadfile()
else: # 服务或者客户端错误
print(resp.error)
break
# 分片上传一个全新的二进制数据流
from io import BytesIO
bio = BytesIO(u'你好'.encode('utf-8'))
ret, resp = multipartuploadufile_handler.uploadstream(public_bucket, sharding_key, bio)
while True:
if resp.status_code == 200: # 分片上传成功
break
elif resp.status_code == -1: # 网络连接问题,续传
ret, resp = multipartuploadufile_handler.resumeuploadstream()
else: # 服务器或者客户端错误
print(resp.error)
break
- HTTP 返回状态码
状态码 | 描述 |
---|---|
200 | 文件或者数据上传成功 |
400 | 上传到不存在的空间 |
403 | API公私钥错误 |
401 | 上传凭证错误 |
from ufile import filemanager
public_bucket = '' #添加公共空间名称
put_key = '' #添加远程文件key
local_file='' #添加本地文件路径
compare_handler = filemanager.FileManager(public_key, private_key)
result=compare_handler.compare_file_etag(public_bucket,put_key,local_file)
if result==True:
logger.info('\netag are the same!')
else:
logger.info('\netag are different!')
from ufile import bucketmanager
bucketmanager_handler = bucketmanager.BucketManager(public_key, private_key)
# 创建新的bucket
bucketname = '' #创建的空间名称
ret, resp = bucketmanager_handler.createbucket(bucketname, 'public')
assert resp.status_code == 200
# 删除bucket
bucketname = '' #待删除的空间名称
ret, resp = bucketmanager_handler.deletebucket(bucketname)
print(ret)
# 获取bucket信息
bucketname = '' # 待查询的空间名称
ret, resp = bucketmanager_handler.describebucket(public_bucket)
print(ret)
# 更改bucket属性
bucketname = '' # 待更改的私有空间名称
bucketmanager_handler.updatebucket(bucketname, 'public'):
# 获得空间文件列表
bucketname = '' #待查询的空间名称
offset = 0 #文件列表起始位置
limit = 20 #获取文件数量
ret, resp = bucketmanager_handler.getfilelist(bucketname, offset, limit)
print(ret)