Flask图片上传的三种策略

前端--->服务器

用户在前端直接点击上传图片,图片则直接保存在服务器本地,这样编程虽然简单,但是当图片逐渐多起来的时候,就会很占服务器的磁盘资源,并且如果想对图片做一些处理,比如控制图片大小,是否加上水印等等就很麻烦。所以不推荐使用该保存方式。示例代码:

前端主要代码:

后端代码:

# 保存到服务器本地
@cms_bp.route("/upload_row/", endpoint="upload_row", methods=["GET", "POST"])
def upload_row():
    # 文件对象保存在request.files上,并且通过前端的input标签的name属性来获取
    fp = request.files.get("f1")
    # 保存文件到服务器本地
    fp.save("a.jpg")
    return redirect(url_for("cms.index"))

前端--->服务器--->七牛云

用户先将图片上传到服务器,服务器做一些过滤等其他图片处理操作后,再将图片上传到七牛云上,服务器只需要保存七牛云返回的图片外链,这样就可以大大的节省服务器空间,但是这个过程服务器既需要接收用户的请求,又需要请求七牛云,这样就很占服务器带宽,降低性能。

前端代码:

后端代码:

from qiniu import Auth, put_data
# 用户上传到服务器,服务器再上传到七牛云
@cms_bp.route("/upload_qn/", endpoint="upload_qn", methods=["GET", "POST"])
def upload_qiniu():
    fp = request.files.get("f2")
    file_name = fp.filename
    # 需要填写你的 Access Key 和 Secret Key
    ak = "******"
    sk = "******"
    # 构建鉴权对象
    q = Auth(ak, sk)
    # 要上传的空间
    bucket_name = 'shop'
    # 上传到七牛后保存的文件名
    key = file_name
    # 生成上传 Token,可以指定过期时间等
    token = q.upload_token(bucket_name, key, 3600)
    ret, info = put_data(token, key, data=fp.read())
    # 如果上传成功
    if info.status_code == 200:
        # 数据库保存该地址
        img_url = "七牛云域名" + ret.get("key")
    return "success"

前端--->七牛云

为了省去中间途径服务器的消耗,前端可以直接上传图片到七牛云,七牛云返回该图片的外链,我们则将外链保存到一个隐藏的input标签上,最后前端提交form表单时将外链提交到服务器保存,因为该过程会使用到很多七牛云为我们写好的JS,具体开发教程请参考七牛云JS SDK文档。这只贴出主要代码。

前端代码:




前端的所有效果通过JS实现,具体JS参考开发文档。

后端代码:

后端只需要编程生成上传图片的token即可

from qiniu import Auth
# 前端直接上传到七牛云
@cms_bp.route("/generate_token/", endpoint="ge_token")
def generate_token():
    # 需要填写你的 Access Key 和 Secret Key
    access_key = current_app.config.get("ACCESSKEY")
    secret_key = current_app.config.get("SECRETKEY")
    # 构建鉴权对象
    q = Auth(access_key, secret_key)
    # 要上传的空间
    bucket_name = 'shop'
    # 生成上传 Token,可以指定过期时间等
    # 3600为token过期时间,秒为单位。3600等于一小时
    token = q.upload_token(bucket_name, expires=3600)
    return jsonify({"uptoken": token})

总结:最后一种图片上传方式,可以将流量的消耗直接转加给用户,减轻服务器压力,所以推荐第三种方式,并且七牛云上提供了很多定制化的接口,可以对图片、视频等等作出定制化处理,第三种方式的js很长,大家可以去开发文档查看,修改成自己需要的,如果不成功,可以给我留言,我发给你Demo。

你可能感兴趣的:(Flask图片上传的三种策略)