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 multiprocessing模块中的Pipe管道使用实例
Apr 11 Python
Python爬取网页中的图片(搜狗图片)详解
Mar 23 Python
详谈Numpy中数组重塑、合并与拆分方法
Apr 17 Python
Python实现的多进程和多线程功能示例
May 29 Python
Python 字符串与数字输出方法
Jul 16 Python
对Python正则匹配IP、Url、Mail的方法详解
Dec 25 Python
Python3 修改默认环境的方法
Feb 16 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
对Django url的几种使用方式详解
Aug 06 Python
python连接mysql有哪些方法
Jun 24 Python
python实现图片九宫格分割的示例
Apr 25 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 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
PHP版自动生成文章摘要
2008/07/23 PHP
php FLEA中二叉树数组的遍历输出
2012/09/26 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
2015/04/20 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
2019/04/09 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
javascript中打印当前的时间实现思路及代码
2013/12/18 Javascript
jQuery unbind()方法实例详解
2016/01/19 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
js 作用域和变量详解
2017/02/16 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
Python导入oracle数据的方法
2015/07/10 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
python中yaml配置文件模块的使用详解
2018/04/27 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
python生成器用法实例详解
2019/11/22 Python
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
鲁迅故居导游词
2015/02/05 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
HTML+CSS制作心跳特效的实现
2021/05/26 HTML / CSS
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android
基于docker安装zabbix的详细教程
2022/06/05 Servers