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


Posted in Python onAugust 03, 2018

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

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

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

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,传递到后台对应的路由处理,查看控制台:

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

后台接收的路由代码:

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 datetime
import random
class 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;

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

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

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

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

图片的下载

@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 photo
@app.route('/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 python
from werkzeug.utils import secure_filename
from flask import Flask, render_template, jsonify, request, make_response, send_from_directory, abort
import time
import os
from strUtil import Pic_str
import base64
 
app = Flask(__name__)
UPLOAD_FOLDER = 'upload'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
basedir = 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 photo
@app.route('/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)

基本示例就以上这些了!

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

Python 相关文章推荐
VSCode下配置python调试运行环境的方法
Apr 06 Python
基于Python列表解析(列表推导式)
Jun 23 Python
浅谈django orm 优化
Aug 18 Python
Python删除n行后的其他行方法
Jan 28 Python
简单了解python PEP的一些知识
Jul 13 Python
python requests使用socks5的例子
Jul 25 Python
学习Django知识点分享
Sep 11 Python
python的命名规则知识点总结
Oct 04 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
Python如何使用内置库matplotlib绘制折线图
Feb 24 Python
python实现扫雷游戏
Mar 03 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 Python
python使用opencv驱动摄像头的方法
Aug 03 #Python
python 简单照相机调用系统摄像头实现方法 pygame
Aug 03 #Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 #Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 #Python
python中copy()与deepcopy()的区别小结
Aug 03 #Python
Python爬取个人微信朋友信息操作示例
Aug 03 #Python
python opencv人脸检测提取及保存方法
Aug 03 #Python
You might like
PHP 转义使用详解
2013/07/15 PHP
php实现利用phpexcel导出数据
2013/08/24 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
php根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
jquery下操作HTML控件的实现代码
2010/01/12 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
Python3.5局部变量与全局变量作用域实例分析
2019/04/30 Python
django 微信网页授权登陆的实现
2019/07/30 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
快速创建python 虚拟环境
2020/11/28 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
通用C#笔试题附答案
2016/11/26 面试题
晚宴邀请函范文
2014/01/15 职场文书
初中同学聚会感言
2014/02/11 职场文书
优秀应届生求职信
2014/06/16 职场文书
企业安全生产目标责任书
2014/07/23 职场文书
火锅店的活动方案
2014/08/15 职场文书
2014年敬老院工作总结
2014/12/08 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python