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检测服务器是否正常
Feb 16 Python
跟老齐学Python之print详解
Sep 28 Python
Python入门篇之面向对象
Oct 20 Python
菜鸟使用python实现正则检测密码合法性
Jan 05 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
详解Python做一个名片管理系统
Mar 14 Python
python mac下安装虚拟环境的图文教程
Apr 12 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
解决python replace函数替换无效问题
Jan 18 Python
关于tf.TFRecordReader()函数的用法解析
Feb 17 Python
pytorch实现加载保存查看checkpoint文件
Jul 15 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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
PHP 上传文件的方法(类)
2009/07/30 PHP
九个你必须知道而且又很好用的php函数和特点
2013/08/08 PHP
php url路由入门实例
2014/04/23 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
Javascript 获取链接(url)参数的方法
2009/02/15 Javascript
浅谈javascript 面向对象编程
2009/10/28 Javascript
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
JavaScript作用域链使用介绍
2013/08/29 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
[02:07]2017国际邀请赛中国区预选赛直邀战队前瞻
2017/06/23 DOTA
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
python列表与元组详解实例
2013/11/01 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
TensorFlow的权值更新方法
2018/06/14 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
解决margin 外边距合并问题
2019/07/03 HTML / CSS
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-> (一千零一拾一元整)输出
2015/05/29 面试题
门诊挂号室室长岗位职责
2013/11/27 职场文书
护士上岗前培训自我鉴定
2014/04/20 职场文书
个人事迹材料范文
2014/12/29 职场文书