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,传递到后台对应的路由处理,查看控制台:
后台接收的路由代码:
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.filenameimg.save(file_path)print '上传头像成功,上传的用户是:'+usernamereturn 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<=100if randomNum <= 10:randomNum = str(0) + str(randomNum);uniqueNum = str(nowTime) + str(randomNum);return uniqueNum;
当我们点击图片上传,选择图片点击提交后,页面返回提示信息如下图:
此时看我们工程下的upload文件夹,唯一名称的图片已经上传成功
图片的下载
@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:passelse:image_data = open(os.path.join(file_dir, '%s' % filename), "rb").read()response = make_response(image_data)response.headers['Content-Type'] = 'image/png'return responseelse: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 base64app = 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 fnameext = fname.rsplit('.', 1)[1]new_filename = Pic_str().create_uuid() + '.' + extf.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:passelse:image_data = open(os.path.join(file_dir, '%s' % filename), "rb").read()response = make_response(image_data)response.headers['Content-Type'] = 'image/png'return responseelse:passif __name__ == '__main__':app.run(debug=True)
基本示例就以上这些了!
Flask实现图片的上传、下载及展示相关推荐
- 【手把手教】Android开发两种方式实现图片的上传下载
Android 图片上传的应用场景 在Android开发中,很多时候我们需要进行图片,文件的上传下载,最直接的一个应用场景就是用户头像的保存与切换,以及像即时通讯中的图片发送等任何在App中设计图片的 ...
- 使用cropbox.js+jquery.js+servlet实现图片的上传下载
采用cropbox.js+jqueryajax + servlet实现图片的上传下载 原理解释: 利用javascript的内置对象FileReader读取计算机中的文件. 读取的文件会被转化为bas ...
- .Net Core 图片文件上传下载
当下.Net Core项目可是如雨后春笋一般发展起来,作为.Net大军中的一员,我热忱地拥抱了.Net Core并且积极使用其进行业务的开发,我们先介绍下.Net Core项目下实现文件上传下载接口. ...
- android开发游记:图片的上传下载-使用七牛云存储管理图片
我们一般都是使用第三方云存储服务来管理图片,图片并不保存在本地,这样的结构,为后台的开发人员省去了很多精力.目前的云存储服务对资源的管理也非常便捷技术也相对成熟,这里我就介绍下目前用的比较多的的七牛云 ...
- java的图片文件上传下载,多表新增,菜品信息分页
上传文件:表单要求 1,enctype="multipart/form-data" 2.表单中需要有type="file"的input 3.表单的请求方式一定是 ...
- maven 项目 springMVC实现文件图片的上传下载功能详解(源码已提供,小白必看)
文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作. ...
- 最新Laravel框架高清壁纸图库图片分享上传下载源码
介绍: 安装环境推荐Linux系统,Apache,php7.1,MySQL 5.6 特点: Laravel框架 收藏系统 实时通知 图片搜索 按颜色与相机搜索 会员可以无限制上传 修改名称.电子邮件. ...
- 最新Laravel框架高清壁纸图库图片分享上传下载网站源码
介绍: 安装环境推荐Linux系统,Apache,php7.1,MySQL 5.6特点:Laravel框架收藏系统实时通知图片搜索按颜色与相机搜索会员可以无限制上传修改名称.电子邮件.密码百度分享SM ...
- Laravel框架高清壁纸图库图片分享上传下载网站源码
介绍: 安装环境推荐Linux系统,Apache,php7.1,MySQL 5.6 特点: Laravel框架 收藏系统 实时通知 图片搜索 按颜色与相机搜索 会员可以无限制上传 修改名称.电子邮件. ...
最新文章
- 2021年大数据常用语言Scala(二十三):函数式编程 扁平化映射 flatMap
- ASP.NET备份与还原SQL Server数据库
- Hibernate 4.2.8,javassist 3.18.1和ClassCastExceptions –注意您的类路径
- javascript 刷新技巧
- 一大波PyTorch图像分割模型来袭,俄罗斯程序员出品新model zoo
- 谷歌和 Zyxel 各修复一个已遭利用的 0day
- @media实现网页自适应中的几个关键分辨率
- 使用MonoDevelop开发跨平台的应用程序
- pytorch 存取模型(待补充)
- 「Algospot」龙曲线DRAGON
- Carrot2 in action_初试身手—融入自己的中文分词器
- 低智商社会,娱乐至死,2书推荐,世界12大理论,
- php nts ts 版本区分
- 计算机科学学院宣传标语,师范学院宣传标语
- 计算机CD_ROM表示中文,CD-ROM是指什么?
- 普元 AppServer 部署应用时报错:Exception while loading the app : CDI deployment failure
- GitLab用户在组中有五种角色权限说明
- Kotlin 学习笔记(四)—— 协程的基础知识,面试官的最爱了~
- Linux grep:获取一个字符串中的一部分
- 51单片机——直流电机调速
热门文章
- 这家公司把三星、联想、微软等7家公司给告了 侵犯其触摸屏专利
- 华为回应“WIFI联盟撤销会员资格”:不会受个别组织影响
- 盗企鹅号发娱乐八卦稿60天收益7.5万元?腾讯回应了...
- 阿里一面,说说你对Mysql死锁的理解
- Spring事务如何集成到Mybatis之springboot事务
- anaconda要和python安装在一个目录下吗_Python开发环境配置,Anaconda的安装!
- ubuntu启动脚本的一些笔记
- django excel 导出页面_Django Admin中增加导出Excel功能过程解析
- 高光谱数据集_文献选读|从地面和空间高光谱数据中提取红边位置参数,以估算水稻冠层叶氮含量...
- 【Elasticsearch】java 客户端 获取 termvectors 词频 统计