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实现TCP服务器端与客户端的方法详解
Apr 30 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
12步入门Python中的decorator装饰器使用方法
Jun 20 Python
Python模拟用户登录验证
Sep 11 Python
Python分支结构(switch)操作简介
Jan 17 Python
python将每个单词按空格分开并保存到文件中
Mar 19 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
Aug 01 Python
详解Pandas之容易让人混淆的行选择和列选择
Jul 10 Python
python3 mmh3安装及使用方法
Oct 09 Python
python+flask编写一个简单的登录接口
Nov 13 Python
基于Python实现流星雨效果的绘制
Mar 18 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
ecshop 订单确认中显示省市地址信息的方法
2010/03/15 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
2015/05/12 PHP
基于PHP实现短信验证码接口(容联运通讯)
2016/09/06 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
JavaScript中实现最高效的数组乱序方法
2014/10/11 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
2015/12/23 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
了解前端理论:rscss和rsjs
2019/05/23 Javascript
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
2020/03/31 Javascript
Python3中的真除和Floor除法用法分析
2016/03/16 Python
Python实现将文本生成二维码的方法示例
2017/07/18 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
《最佳路径》教学反思
2014/04/13 职场文书
档案接收函格式
2015/01/30 职场文书
个人年终总结范文
2015/03/09 职场文书
2015秋学期开学寄语
2015/05/28 职场文书
2015年教师国培感言
2015/08/01 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
2019入党申请书格式和范文
2019/06/25 职场文书
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis
MySQL派生表联表查询实战过程
2022/03/20 MySQL
Z-Order加速Hudi大规模数据集方案分析
2022/03/31 Servers