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实现zencart产品数据导入到magento(python导入数据)
Apr 03 Python
python基于Tkinter库实现简单文本编辑器实例
May 05 Python
Python增量循环删除MySQL表数据的方法
Sep 23 Python
python针对excel的操作技巧
Mar 13 Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 Python
python3 实现对图片进行局部切割的方法
Dec 05 Python
Python初学者常见错误详解
Jul 02 Python
Python HTTP下载文件并显示下载进度条功能的实现
Apr 02 Python
python3中的logging记录日志实现过程及封装成类的操作
May 12 Python
如何在python中实现线性回归
Aug 10 Python
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 Python
python 判断字符串当中是否包含字符(str.contain)
Jun 01 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+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
PHP中Cookie的使用详解(简单易懂)
2017/04/28 PHP
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
简介AngularJS中使用factory和service的方法
2015/06/17 Javascript
jQuery实现区域打印功能代码详解
2016/06/17 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
js运动事件函数详解
2016/10/21 Javascript
JS的Ajax与后端交互数据的实例
2018/08/08 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
Python中for循环和while循环的基本使用方法
2015/08/21 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
Python递归实现打印多重列表代码
2020/02/27 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
vscode调试django项目的方法
2020/08/06 Python
python中os.remove()用法及注意事项
2021/01/31 Python
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
房地产开发计划书
2014/01/10 职场文书
《窗前的气球》教学反思
2014/04/07 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
企业文明单位申报材料
2014/05/16 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
学校德育工作总结2015
2015/05/11 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技