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中的变量和作用域详解
Jul 13 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
Sep 15 Python
Python解析excel文件存入sqlite数据库的方法
Nov 15 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
python3.x实现发送邮件功能
May 22 Python
Python爬虫框架scrapy实现的文件下载功能示例
Aug 04 Python
opencv python 图像去噪的实现方法
Aug 31 Python
对python3中pathlib库的Path类的使用详解
Oct 14 Python
对python csv模块配置分隔符和引用符详解
Dec 12 Python
python中的数据结构比较
May 13 Python
python实现自动化上线脚本的示例
Jul 01 Python
Django框架中模型的用法
Jun 10 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
最省空间的计数器
2006/10/09 PHP
php常用ODBC函数集(详细)
2013/06/24 PHP
php广告加载类用法实例
2014/09/23 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
jQuery前台数据获取实现代码
2011/03/16 Javascript
JS简单计算器实例
2015/01/20 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
vue3修改link标签默认icon无效问题详解
2019/10/09 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
[51:44]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第二场
2018/04/04 DOTA
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
《记承天寺夜游》教学反思
2014/02/16 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
杜甫草堂导游词
2015/02/03 职场文书
工作时间调整通知
2015/04/24 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
css height属性中的calc方法详解
2021/06/03 HTML / CSS
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript