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 相关文章推荐
给Python IDLE加上自动补全和历史功能
Nov 30 Python
python通过smpt发送邮件的方法
Apr 30 Python
Python的dict字典结构操作方法学习笔记
May 07 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
Apr 15 Python
用生成器来改写直接返回列表的函数方法
May 25 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
Aug 23 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
Aug 24 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
Mar 10 Python
TensorFlow实现批量归一化操作的示例
Apr 22 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
Jun 23 Python
Python 获取异常(Exception)信息的几种方法
Dec 29 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 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.ini中配置屏蔽错误信息显示和保存错误日志的例子
2014/05/12 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
微信小程序开发之toast提示插件使用示例
2017/06/08 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
npm qs模块使用详解
2020/02/07 Javascript
Python中实现的RC4算法
2015/02/14 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
python实现随机漫步方法和原理
2019/06/10 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
Python for循环搭配else常见问题解决
2020/02/11 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
银行实习自我鉴定
2013/10/12 职场文书
应届大学生求职信
2013/12/01 职场文书
双十佳事迹材料
2014/01/29 职场文书
小学敬老月活动方案
2014/02/11 职场文书
倡议书格式
2014/04/14 职场文书
经营理念口号
2014/06/21 职场文书
素质教育标语
2014/06/27 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android
JS实现简单的九宫格抽奖
2022/06/28 Javascript