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 相关文章推荐
flask中使用SQLAlchemy进行辅助开发的代码
Feb 10 Python
微信跳一跳python代码实现
Jan 05 Python
Flask 让jsonify返回的json串支持中文显示的方法
Mar 26 Python
python实现简单tftp(基于udp协议)
Jul 30 Python
python对html过滤处理的方法
Oct 21 Python
使用Python中的reduce()函数求积的实例
Jun 28 Python
python并发编程多进程 互斥锁原理解析
Aug 20 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
Oct 28 Python
解决python彩色螺旋线绘制引发的问题
Nov 23 Python
Pyinstaller 打包发布经验总结
Jun 02 Python
Python基础之元类详解
Apr 29 Python
python如何将mat文件转为png
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
德劲1107的电路分析与打磨
2021/03/02 无线电
PHP Google的translate API代码
2008/12/10 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
PHP中的Memcache详解
2014/04/05 PHP
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
js格式化时间小结
2014/11/03 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
2015/12/03 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
2019/03/02 NodeJs
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
javascript实现点击星星小游戏
2019/12/24 Javascript
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
Django权限设置及验证方式
2020/05/13 Python
工程质量承诺书
2014/03/27 职场文书
个人银行贷款担保书
2014/04/01 职场文书
励志演讲稿200字
2014/08/21 职场文书
新闻人物通讯稿
2014/10/09 职场文书
批评与自我批评范文
2014/10/15 职场文书
三方协议书
2015/01/27 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL