将网络图片上传到阿里云,使用网络流,无需下载本地
import os
import uuid
import oss2
import requests
import yaml
# 读配置文件
def read_config(file_path):
if not os.path.isfile(file_path):
print('config file not found:%s',file_path)
return False
with open(file_path, 'r', encoding='utf-8') as f:
config = yaml.load(f)
return config
def up_pic(ranks, times=3):
for v in ranks:
if v['iconlink']:
flag = 0
url = v['iconlink']
u = str(uuid.uuid1())
while times:
try:
result = upload(img_url=url, uuid=u)
except Exception as e:
times = 1
print('[upload_pic Error] %s', e)
if result:
flag = 0
v['iconlink'] = result
break
else:
flag = 1
print('[upload_pic defeat ] %s', times)
if flag == 1:
v['iconlink'] = url
else:
print('[not pic] %s', v)
return ranks
def upload(img_url, uuid):
# uuid是唯一的,保证图片名不会重复
uuid = uuid + '.jpg'
# 以下为配置参数
region = 'hotsquare'
accessId = config['clouds'][region]['aliyun_accessid']
accessKey = config['clouds'][region]['aliyun_accesskey']
oss_endpoint = config['clouds'][region]['oss_endpoint']
bucketname = config['clouds'][region]['backet_pic']
host_pic = config['clouds'][region]['host_pic']
# 上传图片
auth = oss2.Auth(accessId, accessKey)
bucket = oss2.Bucket(auth, oss_endpoint, bucketname)
input = requests.get(img_url)
result = bucket.put_object(uuid, input)
if result:
return host_pic + uuid
return False
if __name__ == '__main__':
config = read_config('config.yaml')
# 存放图片链接的列表
# pic_list内是字典,类似:{'iconlink':pic_url}
# 遍历时会检查iconlink
pic_list = []
# 上传完成后返回的图片链接列表
results = up_pic(pic_list)
config.yaml文件格式
clouds:
hotsquare:
aliyun_accessid :
aliyun_accesskey:
oss_endpoint:
backet_pic:
host_pic:
mns_endpoint: