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 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
Python 自动补全(vim)
Nov 30 Python
Python编程中归并排序算法的实现步骤详解
May 04 Python
实现python版本的按任意键继续/退出
Sep 26 Python
python条件变量之生产者与消费者操作实例分析
Mar 22 Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 Python
在Python中os.fork()产生子进程的例子
Aug 08 Python
TensorFlow 读取CSV数据的实例
Feb 05 Python
python第三方库学习笔记
Feb 07 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 Python
一文搞懂Python Sklearn库使用
Aug 23 Python
pd.drop_duplicates删除重复行的方法实现
Jun 16 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 Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
自制PHP框架之模型与数据库
2017/05/07 PHP
thinkphp3.2.0 setInc方法 源码全面解析
2018/01/29 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
javascript this用法小结
2008/12/19 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
JavaScript入门基础
2015/08/12 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
JavaScript组件开发完整示例
2015/12/15 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
2017/01/10 Javascript
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
python学习手册中的python多态示例代码
2014/01/21 Python
解析Python中的变量、引用、拷贝和作用域的问题
2015/04/07 Python
numpy中的ndarray方法和属性详解
2019/05/27 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
Python OpenCV实现测量图片物体宽度
2020/05/27 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
法国亚马逊官方网站:Amazon.fr
2020/12/19 全球购物
车间组长岗位职责
2013/12/20 职场文书
安全责任书模板
2014/07/22 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
2015安全保卫工作总结
2015/04/25 职场文书
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫