前言
其实这个工具类去年就写了,可以参考我转换图片格式的文章: https://blog.csdn.net/wgPython/article/details/80740067
现在分享出来是想着做个笔记方便自己,然后本着互联网的分享精神,我自己的代码写的也不是很完美,可能很多地方需要大家的指正。
可以自行查看七牛云官方文档地址:https://developer.qiniu.com/kodo/sdk/1242/python 但是都是以本地图片做演示的,我的demo是以图片字节流操作。
准备工作
# 版本 因为我们要用f-string这种特性
python >= 3.6
# 需要安装七牛云sdk pip install qiniu 或者 pipenv install qiniu
from qiniu import Auth, put_data, put_file
# 这四个参数需要从七牛云控制台获取
from settings import ACCESS_KEY, SECRET_KEY, BUCKET_NAME, PREFIX_URL
方式一 最简洁方式
import uuid # 需要倒入uuid 用来命名
def up_file(content):
"""
七牛云上传媒体文件
:param content: 图片字节流数据
:return:
"""
try:
q = Auth(ACCESS_KEY, SECRET_KEY)
# 上传到七牛后保存的文件名uuid4+后缀 拼接url
file_path = f"{uuid.uuid4()}.jpg"
token = q.upload_token(BUCKET_NAME, file_path, 3600) # 3600指的是token的过期时间
ret, info = put_data(token, file_path, content)
if ret:
# 上传成功返回地址
return PREFIX_URL + file_path
else:
print("上传失败")
return None
except Exception as e:
# 上传失败返回None
print("上传GG", e)
return None
# 调用演示
if __name__ == '__main__':
# url = "https://www.baidu.com/img/xinshouye_d63d8cd784cea6223a26e3ce33344353.png"
baidu_logo = "https://www.baidu.com/img/bd_logo1.png"
res = requests.get(baidu_logo, stream=True)
n = up_file(res.content)
print(n)
这种方式是最简单的,优点是代码最简单,和django或者flask对接起来也很方便,因为操作的是文件字节流,缺点是要自己写请求, 然后图片后缀是写死的.jpg,没有对图片的任何操作
方式二 稍微封装
# 由于下面 requests 加了verify=False 不验证ssl证书 就会有警告,这行目的是去掉警告
requests.urllib3.disable_warnings()
class QiNiuUpData(object):
def __init__(self, time_out=10, headers=None):
"""
:param time_out: 超时时间
:param headers: 请求头
"""
self.q = Auth(ACCESS_KEY, SECRET_KEY)
self.time_out = time_out
self.headers = headers
def up_file(self, img_url, suffix_type="jpg"):
if not img_url:
return
try:
# 上传到七牛后保存的文件名uuid4+后缀 拼接url
file_path = f"{uuid.uuid4()}.{suffix_type}"
token = self.q.upload_token(BUCKET_NAME, file_path, 3600) # 3600指的是token的过期时间
with requests.get(img_url, stream=True, verify=False, timeout=self.time_out) as file:
ret, info = put_data(token, file_path, file.content)
if ret:
# 上传成功返回地址
return PREFIX_URL + file_path
else:
print("上传失败", img_url)
return None
except Exception as e:
# 上传失败返回None
print("上传GG", img_url, self.headers, e)
return None
if __name__ == '__main__':
# url = "https://www.baidu.com/img/xinshouye_d63d8cd784cea6223a26e3ce33344353.png"
baidu_logo = "https://www.baidu.com/img/bd_logo1.png"
qiniu_up = QiNiuUpData()
n = qiniu_up.up_file(baidu_logo, suffix_type="png")
print(n)
注意上传视频的时候,记得用http长链接,具体操作如下
在requests请求的中加入请求头
requests.get(mp4_url, headers={
"Connection": "keep-alive",
}, stream=True)
这种方式稍微好一些,把请求的方式直接封装了,只需要传入url 和后缀就行,但还是有缺陷,比如图片格式我们事先不知道,不能及时给出来,还有就是图片需要其他操作,比如转格式,压缩大小之类的。
方式三 添加图片操作封装
# 等会儿后面在加上吧, 现在不想写了。