flask 实现上传图片并缩放作为头像的例子
作者:子辰曦 发布时间:2021-09-08 06:32:42
标签:flask,上传图片,缩放,头像
个人开发的 flask 论坛进入尾声,还剩最后一个上传图片更换头像功能,搞了一整天,最后终于解决了所有问题,现在记录下解决方案。
1. 上传文件
分析一下更换头像功能,我们需要做哪些事,简单的思路是:上传文件,获取文件的 url 。
文件上传的基本原理实际上很简单,基本上是:
一个带有 enctype=multipart/form-data 的 <form> 标记,标记中含有 一个 <input type=file>。
应用通过请求对象的 files 字典来访问文件。
使用文件的 save() 方法把文件永久 地保存在文件系统中。
于是可以得到我们的提供上传按钮的表单页面:
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}SYSUfm - 更换头像{% endblock %}
{% block page_content %}
<div class="page-header">
<h1>更换你的头像</h1>
</div>
<div class="col-md-4">
<form action="" method=post enctype=multipart/form-data>
<input type=file name=file><br/>
<input type=submit value=Upload>
</form>
</div>
{% endblock %}
2. 创建略缩图
接下来我们需要有路由到这个页面的视图函数,服务器后台端的代码如下:
@main.route('/edit-avatar', methods=['GET', 'POST'])
@login_required
def change_avatar():
if request.method == 'POST':
file = request.files['file']
size = (40, 40)
im = Image.open(file)
im.thumbnail(size)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
im.save(os.path.join(main.static_folder, 'avatar', filename))
current_user.new_avatar_file = url_for('main.static', filename='%s/%s' % ('avatar', filename))
current_user.is_avatar_default = False
flash(u'头像修改成功')
return redirect(url_for('.user', username=current_user.username))
return render_template('change_avatar.html')
这里 main 是一个 blueprint,file = request.files['file'] 语句获得图片文件对象,将其转换为 Image 对象,通过 thumbnail 方法进行略缩。
最后 im.save(os.path.join(main.static_folder, 'avatar', filename)) 语句将略缩图片保存到服务指定路径。
来源:https://blog.csdn.net/u012675539/article/details/50926848


猜你喜欢
- 你喜欢在博客文章中使用图片吗?是的,如果不是很麻烦的话,相信大家都不会介意放上几张漂亮的图片来点缀一下内容的,不过你的图片可能会导致下面的两
- 前言最近工作中遇到个需求是要得到一个类的静态属性,也就是说有个类 Type ,我要动态获取 Type.FTE 这个属性的值。最简单的方案有两
- 问题一: 在anconda里面如何创建新的python环境(也就是更换新的python版本)1.先打开anconda软件,创建需要的环境2.
- DB存储层次结构(画了个草图,将就看一下...XD)管理表空间 &nb
- <%'**************************************************'函数名:g
- 分区视图联接来自一组成员的水平分区数据,使数据看起来象来自同一张表。SQL Server 2000 区分本地分区视图和分布式分区视图。在本地
- 能够为数据库数据提供的最简单的用户界面之一就是窗体,窗体可以一次性呈现出来自同一记录的各个域。本文通过python3+pyqt5改写实现了p
- 微信指数爬取 Appium + mitmproxy + 网易mumu安卓模拟器实现微信指数小程序爬取通过appium实现将指令传输
- 在做NLP(自然语言处理)相关任务时,经常会遇到需要识别并提取省、城市、行政区的需求。虽然我们自己通过关键词表一个个查找也能实现提取目的,但
- 本人python新手小白,记录学习过程中遇到的一些小问题。python 爬虫获取网页资源之前,联网是必须的,作为 python 中最常用的
- 现在实际的情况是这样的:客户有一台打卡机,员工打卡的信息全部储存在打卡机的Access数据库里面,现在客户引入了一种新的管理系统,需要将Ac
- 原作者:Nik Piepenbreier翻译&内容补充:费弗里原文地址:https://towardsdatascience.com
- MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特
- 首先,了解下原理。1,提供文本框进行查询内容的输入2,将查询信息提交页面程序处理3,程序页主要作用:接受查询信息,根据此信息调用特定的SQL
- 最近正在做首页,处理很棘手的浏览器兼容的问题,主要调试的浏览器为 IE6 ,IE7 ,FF3 ,Opera9.5 ,Safari3.1.2兼
- 在页面中自定义了changejs函数后页面提示错误:Active Server Pages 错误 'ASP 0138' 嵌套
- 1.触发器概述触发器是SQL Server数据库应用中一个重要工具,是一种特殊类型的存储过程,应用非常广泛。一般存储过程主要通过存储过程名而
- 阅读上一篇:打造设计你自己的字体 ⅠMyFonts.com上销售的字体总数已经超过55,000个。现有字体的巨大数量表明了一个事实:我们在设
- 1.原始数据是这样的2.脚本如下:import pandas as pddf = pd.read_excel(r'E:\untitl
- 如下所示:x = 3print(x+"nihao")这样会报错x = 3print(x,"nihao"