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中os和shutil模块实用方法集锦
May 13 Python
跟老齐学Python之有容乃大的list(3)
Sep 15 Python
python根据开头和结尾字符串获取中间字符串的方法
Mar 26 Python
python实现类的静态变量用法实例
May 08 Python
使用python在本地电脑上快速处理数据
Jun 22 Python
Python中使用支持向量机(SVM)算法
Dec 26 Python
python实现多张图片拼接成大图
Jan 15 Python
python实践项目之监控当前联网状态详情
May 23 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
Python自定义sorted排序实现方法详解
Sep 18 Python
Python 使用office365邮箱的示例
Oct 29 Python
python高温预警数据获取实例
Jul 23 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数据饼图效果实现代码
2011/11/23 PHP
如何判断php数组的维度
2013/06/10 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
js最简单的拖拽效果实现代码
2010/09/24 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
JavaScript改变CSS样式的方法汇总
2015/05/07 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
2016/05/17 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
2017/12/18 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
python生成ppt的方法
2018/06/07 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
Python如何实现远程方法调用
2020/08/07 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
GWebs公司笔试题
2012/05/04 面试题
幼儿园教师教育感言
2014/02/28 职场文书
导师就业推荐信范文
2014/05/22 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
python基础之爬虫入门
2021/05/10 Python