前言
之前使用华为云数据库其实主要是为了存储自己的图片,但后面发现如果用数据库存储图片的话将面临主要两个问题。
第一,数据库数据类型有限制,不方便我们操作,不够灵活,当我们想要再存储其它东西的时候还需要修改数据库列的类型。
第二,因为我主要是为了存储图片,如果想要通过python存储图片到数据库的话,中间有一个数据类型转化的过程,每次都需要转码以及解码,这个过程浪费了很多时间以及资源。(还有很多脑细胞)
因此,我选择了数据库+云存储的方式来实现图片的存储以及管理(很多人应该都是这么做的吧)
本文呢就是主要介绍一下怎么通过python来创建以及使用华为云的云数据存储服务OBS。(最基础的,自己使用的经验,没用到的也没去接触)
刚开始我有点担心速度的问题,后面发现我想多了,图片大小1.17MB,上传速度实测0.5s左右,下载速度实测也在0.5s左右。
如果发现文章哪里有问题,欢迎指正。
创建桶
首先呢,我们在华为云的服务列表里的存储类里面找到对象存储服务OBS。进入之后我们点击右上角的创建桶。
具体怎么配置的话还是看你的使用情况,我的因为是经常性的使用且都是小文件,所以是这么配置的。
配置完成后点立即创建就完成了。官方介绍的使用流程是分成五步的,但是我因为没有特殊需求就没有进行配置,感兴趣的话可以自己了解下。我们刚刚完成了第一步的创建,第二第三步我直接跳过了,第四项的话它默认是帮你监控的,如果你需要监控其它什么数据的话看可以自己设置下,最后的第五步就是需要你花钱了(创建桶是免费的)
我们点击购买资源包。下面的这个是我买的配置,主要是单az和多az那里别选错了,其它的根据自己的需求来就行了。同样价格还是很便宜的。
购买之后我们基本就配置的差不多了。下面一步,我们需要找到个人凭证。
在我的凭证里面有个访问密钥,我们新增一个密钥。新增完成后网页会自动下载一个csv文件。别误删了,每个密钥好像都是只能下载这一次。当然,不嫌麻烦可以再新增。。。csv文件里面总共有三项。第一项是你华为云账号的名称,后面的Access Key Id和Secret Access Key就是你的id和密码了。此外,我们还需要一个信息,就是我们创建桶的访问地址,我们点击我们的桶,在基本信息里面可以看到个访问域名,我们将这个信息记下来。下面我们就可以开始python端的实现了。
python端实现
同样我这里就是使用的官方的SDK,具体的大家可以在官方SDK文档里面找,我这里给大家演示的就是文件的上传和下载了。
首先我们要安装官方的SDK,就直接跟安装其它第三方库一样pip install esdk-obs-python就可以了。
文件上传
from obs import ObsClient
from datetime import datetime
start = datetime.now()#用来计时
# 创建ObsClient实例
obsClient = ObsClient(
access_key_id='Access Key Id',#刚刚下载csv文件里面的Access Key Id
secret_access_key='Secret Access Key',#刚刚下载csv文件里面的Secret Access Key
server='https://访问域名'#这里的访问域名就是我们在桶的基本信息那里记下的东西
)
# 使用访问OBS
# 调用putFile接口上传对象到桶内
resp = obsClient.putFile('桶的名称', '文件存储在桶内的名称', file_path='要上传的那个文件的本地路径')
if resp.status < 300:
# 输出请求Id
print('requestId:', resp.requestId)
else:
# 输出错误码
print('errorCode:', resp.errorCode)
# 输出错误信息
print('errorMessage:', resp.errorMessage)
# 关闭obsClient
obsClient.close()
end = datetime.now()
print(end-start)#打印出使用的总时间
文件下载
from obs import ObsClient
from datetime import datetime
start = datetime.now()#用来计时
# 创建ObsClient实例
obsClient = ObsClient(
access_key_id='Access Key Id',#刚刚下载csv文件里面的Access Key Id
secret_access_key='Secret Access Key',#刚刚下载csv文件里面的Secret Access Key
server='https://访问域名'#这里的访问域名就是我们在桶的基本信息那里记下的东西
)
# 调用getObject接口下载桶内对象
# 本地路径记得加上文件名和后缀 比如F:/test_picture/1.jpg
resp = obsClient.getObject('桶的名称', '文件存储在桶内的名称', downloadPath='下载到的本地路径')
if resp.status < 300:
print('requestId:', resp.requestId)
print('url:', resp.body.url)
else:
print('errorCode:', resp.errorCode)
print('errorMessage:', resp.errorMessage)
# 关闭obsClient
obsClient.close()
end = datetime.now()
print(end-start)#打印出使用的总时间