侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Flask实现图片的上传、下载及展示示例代码

技术  /  管理员 发布于 7年前   148

用Flask处理图片非常容易,这一篇学习一下图片的上传、下载及展示。还是以实例代码演示为主。

首先,实现一个简单的上传(过程中未做任何处理,只是为了演示)

点击选择图片,输入李四:

HTML代码:

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>Title</title></head>  <body>    <div>      <form method="post" action="http://localhost:5000/up_photo" enctype="multipart/form-data">      <input type="file" size="30" name="photo"/>      <br>      <input type="text" class="txt_input" name="name" style="margin-top:15px;"/>      <input type="submit" value="提交信息" class="button-new" style="margin-top:15px;"/>      </form>    </div>  </body></html>

点击提交信息后,通过 http://localhost:5000/up_photo,传递到后台对应的路由处理,查看控制台:

后台接收的路由代码:

basedir = os.path.abspath(os.path.dirname(__file__)) @app.route('/up_photo', methods=['post'])def up_photo():  img = request.files.get('txt_photo')  username = request.form.get("name")  path = basedir+"/static/photo/"  file_path = path+img.filename  img.save(file_path)  print '上传头像成功,上传的用户是:'+username  return render_template('index.html')

此时,我们查看static/photo时,已经可以看到我们点击上传的图片了。

以上是最简单的一个文件上传示例,我们实际使用中基本不可能这样去写,通常会做一些处理。例如:上传后做图片名称唯一性的处理、限制上传文件的类型、无论上传成功或者失败,都去做一些返回提示等等。

限制上传文件类型,例如,我们希望用户上传的文件为图片类型

ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'gif', 'GIF']) def allowed_file(filename):  return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

上面的代码片段通过截取上传文件的后缀名,判断是否是属于我们期望用户上传的类型。

更改上传图片名称,防止重名

这里我们使用日期加随机数生成图片名,做一个生成字符串的工具类

#-*-coding:utf-8-*-import datetimeimport randomclass Pic_str:  def create_uuid(self): #生成唯一的图片的名称字符串,防止图片显示时的重名问题    nowTime = datetime.datetime.now().strftime("%Y%m%d%H%M%S"); # 生成当前时间    randomNum = random.randint(0, 100); # 生成的随机整数n,其中0<=n<=100    if randomNum <= 10:      randomNum = str(0) + str(randomNum);    uniqueNum = str(nowTime) + str(randomNum);    return uniqueNum;

当我们点击图片上传,选择图片点击提交后,页面返回提示信息如下图:

此时看我们工程下的upload文件夹,唯一名称的图片已经上传成功

图片的下载

@app.route('/download/<string:filename>', methods=['GET'])def download(filename):  if request.method == "GET":    if os.path.isfile(os.path.join('upload', filename)):      return send_from_directory('upload', filename, as_attachment=True)    pass

图片的展示

# show [email protected]('/show/<string:filename>', methods=['GET'])def show_photo(filename):  file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER'])  if request.method == 'GET':    if filename is None:      pass    else:      image_data = open(os.path.join(file_dir, '%s' % filename), "rb").read()      response = make_response(image_data)      response.headers['Content-Type'] = 'image/png'      return response  else:    pass

完整示例代码

#encoding:utf-8#!/usr/bin/env pythonfrom werkzeug.utils import secure_filenamefrom flask import Flask, render_template, jsonify, request, make_response, send_from_directory, abortimport timeimport osfrom strUtil import Pic_strimport base64 app = Flask(__name__)UPLOAD_FOLDER = 'upload'app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDERbasedir = os.path.abspath(os.path.dirname(__file__))ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'gif', 'GIF']) def allowed_file(filename):  return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS  @app.route('/upload')def upload_test():  return render_template('up.html')  # 上传文件@app.route('/up_photo', methods=['POST'], strict_slashes=False)def api_upload():  file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER'])  if not os.path.exists(file_dir):    os.makedirs(file_dir)  f = request.files['photo']  if f and allowed_file(f.filename):    fname = secure_filename(f.filename)    print fname    ext = fname.rsplit('.', 1)[1]    new_filename = Pic_str().create_uuid() + '.' + ext    f.save(os.path.join(file_dir, new_filename))     return jsonify({"success": 0, "msg": "上传成功"})  else:    return jsonify({"error": 1001, "msg": "上传失败"}) @app.route('/download/<string:filename>', methods=['GET'])def download(filename):  if request.method == "GET":    if os.path.isfile(os.path.join('upload', filename)):      return send_from_directory('upload', filename, as_attachment=True)    pass    # show [email protected]('/show/<string:filename>', methods=['GET'])def show_photo(filename):  file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER'])  if request.method == 'GET':    if filename is None:      pass    else:      image_data = open(os.path.join(file_dir, '%s' % filename), "rb").read()      response = make_response(image_data)      response.headers['Content-Type'] = 'image/png'      return response  else:    pass  if __name__ == '__main__':  app.run(debug=True)

基本示例就以上这些了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    matplotlib调整子图间距,调整整体空白的方法
    下一条:
    OpenCV2从摄像头获取帧并写入视频文件的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客