Python的Tornado框架实现图片上传及图片大小修改功能


Posted in Python onJune 30, 2016

图片的上传

上传图片使用了表单提交, 下面是html部分, enctype="multipart/form-data"表示不对字节进行编码,上传文件类型时需指定. input标签的 type="file" 指定上传类型.

<form action="/" enctype="multipart/form-data" method="post">
  <input type="file" name="headimg">
</form>

下面是tornado接受文件的部分

class UploadHandler(BaseHandler):
  def post(self):
    # 这部分就是上传的文件,想要查看更多可以print self.request看看
    # 该文件返回一个元素为字典的列表
    imgfile = self.request.files.get('headimg')
    for img in imgfile:
      # img有三个键值对可以通过img.keys()查看
      # 分别是 'filename', 'body', 'content_type' 很明显对应着文件名,内容(二进制)和文件类型
      with open('./static/uploads/' + img['filename'], 'wb') as f:
        # 文件内容保存 到'/static/uploads/{{filename}}'
        f.write(f['body'])

这样就可以通过/static/uploads/文件名的形式访问

对图片大小进行修改

下面将写对图片进行的resize

class UploadHandler(BaseHandler):
  @tornado.web.authenticated
  def post(self):
    # 应该写到上面, 为了显示写到了函数内
    import time
    # PIL 是 python中对图片进行操作的模块, 感兴趣可以去看一下
    from PIL import Image
    # 可以想文件一样使用, 只是存放在内存
    from cStringIO import StringIO

    # 判断上传文件大小
    size = int(self.request.headers.get('Content-Length'))
    if size / 1000.0 > 2000:
      self.write("上传图片不能大于2M.")
    imgfile = self.request.files.get('headimg')
    for img in imgfile:
      # 对文件进行重命名
      name = str(time.strftime('%Y%m%d%'), time.localtime())\
          + '_' + self.current_user + '_headimg.png'

      with open('./static/uploads/' + name, 'wb') as f:
        # image有多种打开方式,一种是 Image.open('xx.png')
        # 另一种就是 Image.open(StringIO(buffer)) 
        im = Image.open(StringIO(img['body']))
        # 修改图片大小resize接受两个参数, 第一个是宽高的元组数据,第二个是对图片细节的处理,本文表示抗锯齿
        im = im.resize((72, 72), Image.ANTIALIAS)
        # 打开io 就像文件一样
        im_file = StringIO()
        im.save(im_file, format='png')
        # 这是获取io中的内容
        im_data = im_file.getvalue() 
        f.write(im_data)

这样就可以上传的时候对文件大小进行修改

Python 相关文章推荐
Python 含参构造函数实例详解
May 25 Python
python matplotlib中文显示参数设置解析
Dec 15 Python
python使用Tesseract库识别验证
Mar 21 Python
python可视化实现KNN算法
Oct 16 Python
django 简单实现登录验证给你
Nov 06 Python
Python JSON编解码方式原理详解
Jan 20 Python
pycharm不能运行.py文件的解决方法
Feb 12 Python
Python装饰器实现方法及应用场景详解
Mar 26 Python
python 错误处理 assert详解
Apr 20 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 Python
flask框架中的cookie和session使用
Jan 31 Python
举例讲解Python中metaclass元类的创建与使用
Jun 30 #Python
在Python中定义和使用抽象类的方法
Jun 30 #Python
Python中functools模块的常用函数解析
Jun 30 #Python
深入浅析Python中join 和 split详解(推荐)
Jun 30 #Python
Python列出一个文件夹及其子目录的所有文件
Jun 30 #Python
django之常用命令详解
Jun 30 #Python
全面了解Python环境配置及项目建立
Jun 30 #Python
You might like
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
基于jQuery架构javascript基础体系
2011/01/01 Javascript
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
js获取select标签的值且兼容IE与firefox
2013/12/30 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
2016/10/09 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
webpack之devtool详解
2018/02/10 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
运动会广播稿150字
2014/02/19 职场文书
经典洗发水广告词
2014/03/13 职场文书
环保建议书300字
2014/05/14 职场文书
公司外出活动方案
2014/08/14 职场文书
先进党组织事迹材料
2014/12/26 职场文书
英文辞职信范文
2015/05/13 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
导游词之张家界
2019/10/31 职场文书
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫
mysql 获取相邻数据项
2022/05/11 MySQL