cAMJlMCcr

23朵毒蘑菇

Python FastAPI上传文件至七牛云

原文章迁移

python|七牛云|FastApi

2020-12-24 09:37:35 已有版本 1 个 show:0.61kTYPE: blog

一篇文字

最近需要给博客添加上传图片的功能,之前有图片上传的,上传主题图片的,考虑到博客的话图片太多就不存到服务器了,存到七牛云上比较好,相关的图片服务也比较多。我的上传流程是:前端上传图片至服务器,服务器在上传到七牛云。

我的后台使用的是Python的框架 FastAPI

注册七牛云账号这些就不用多说了吧 七牛云官网

第一步:安装七牛云SDK (使用pip安装)

pip install qiniu

第二步:创建 UploadQiNiu.py 文件(文件名随意),里面的代码如下

#引入相关类及函数
from qiniu import Auth,put_data,put_file

#上传文件类
class UploadQiNiu:

    #只支持单文件上传
    def __init__(self,config):
        self.access_key = config['access_key']
        self.secret_key = config['secret_key']
        self.bucket_name = config['bucket_name']
        self.domain = config['domain']
        #初始化对接
        self._q = Auth(self.access_key, self.secret_key)

    # 上传本地文件
    # source_file_path 本地文件路径
    # save_file_name 上传到七牛云上保存时的名字
    def uploadFile(self, source_file_path, save_file_name):
        #生成上传token
        token = self._q.upload_token(self.bucket_name, save_file_name)
        #上传文件
        ret, info = put_file(token, save_file_name, source_file_path)
        #根据返回信息判断是否上传成功
        if info.status_code == 200:
            #返回链接
            return '/' . join([self.domain, save_file_name])
        return None

    #上传二进制文件流
    # file_data 文件流数据(二进制数据)
    # save_file_name 上传到七牛云上保存时的名字
    def uploadData(self,file_data, save_file_name):
        #生成上传token
        token = self._q.upload_token(self.bucket_name, save_file_name)
        #上传文件
        ret, info = put_data(token, save_file_name, file_data)
        if info.status_code == 200:
            return '/' . join([self.domain, save_file_name])
        return None

#相关配置(我的配置不会怎么变,所以放在这里全局引用,根据自己情况来)
config = {
    'access_key': '',  # 填你的access_key
    'secret_key': '',  # 填你的secret_key
    'bucket_name': '',  # 填你的存储空间名称
    'domain': ''  # 填你的空间域名
}

#外部调用直接引入以下两个函数就行了
#上传本地文件
def uploadFile(source_file_path:str,save_file_name:str):
    try:
        uploadQiNiu = UploadQiNiu(config)
        url = uploadQiNiu.uploadFile(source_file_path,save_file_name)
        return url
    except:
        return False

#上传二进制文件
def uploadData(data:str,save_file_name:str):
    try:
        uploadQiNiu = UploadQiNiu(config)
        url = uploadQiNiu.uploadData(data,save_file_name)
        return url
    except:
        return False

#测试
if __name__ == '__main__':
    #上传同目录下的ceshi.md文件
    with open( 'ceshi.md', 'rb') as f:
        #以文件流形式上传
        url = uploadData(f.read(), 'ceshi.md')
        print(url)

外部引用后直接调用就行了

from 文件位置 import uploadFile,uploadData

更多请查看七牛云开发文档,更详细。


七牛云上的图片服务很强大根据链接所带的参数实现对图片的裁剪,压缩,推荐使用呀!