Python tornado上传文件的功能


Posted in Python onMarch 26, 2020

Tornado是一种 Web 服务器软件的开源版本。Tornado 和主流Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

得利于其非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。

在web开发过程中,文件上传是经常用到的功能,比如上传附件,上传照片等。下面我们来介绍一下利用tornado 来实现简单的文件上传功能。

普通上传

# coding: utf-8
import tornado.ioloop
import tornado.web
import shutil
import os
import json
class FileUploadHandler(tornado.web.RequestHandler):
  def get(self):
    self.write('''
<html>
 <head><title>Upload File</title></head>
 <body>
  <form action='file' enctype="multipart/form-data" method='post'>
  <input type='file' name='file'/><br/>
  <input type='submit' value='submit'/>
  </form>
 </body>
</html>
''')

  def post(self):
    ret = {'result': 'OK'}
    upload_path = os.path.join(os.path.dirname(__file__), 'files') # 文件的暂存路径
    file_metas = self.request.files.get('file', None) # 提取表单中‘name'为‘file'的文件元数据

    if not file_metas:
      ret['result'] = 'Invalid Args'
      return ret

    for meta in file_metas:
      filename = meta['filename']
      file_path = os.path.join(upload_path, filename)

      with open(file_path, 'wb') as up:
        up.write(meta['body'])
        # OR do other thing

    self.write(json.dumps(ret))


app = tornado.web.Application([
  (r'/file', FileUploadHandler),
])

if __name__ == '__main__':
  app.listen(8080)
  tornado.ioloop.IOLoop.instance().start()

采用ajax上传

采用ajax上传,需要修改一下前端发送请求的方式。可参照如下方式:

<html>
   <head><title>Upload File</title>
   <script type="text/javascript" src="/www/static/jquery.min.js"></script>
   </head>
   <body>
    <form id='upload' action='upload' enctype="multipart/form-data" method='post'>
    <input type='file' name='file'/><br/>
    <input type='button' id='submit' value='submit'/>
    </form>
   </body>
   <script>
    $('#submit').click(function(){
      var form = $('form')[0];
      var formData = new FormData(form);
      formData.append('image', $('input[type=file]')[0].files[0]);
      $.ajax({
        url: '/file/upload',
        data: formData,
        type: 'POST',
        contentType: false,
        processData: false,
        success: function(data){
          var obj = jQuery.parseJSON(data);
          alert(obj.result);
          // TODO
        },
        error: function(data){
          var obj = jQuery.parseJSON(data);
          alert(data.result);
        }
      })
    });

   </script>
  </html>

注意

tornado处理文件上传时,会把整个文件放在内存中。
如果有上传大文件的需求,一般会使用nginx的文件上传模块 (第三方模块,需要编译)。

总结

到此这篇关于Python tornado上传文件的功能的文章就介绍到这了,更多相关Python tornado上传文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python-基础-入门 简介
Aug 09 Python
Python编程之多态用法实例详解
May 19 Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 Python
Django学习笔记之ORM基础教程
Mar 27 Python
python爬虫正则表达式之处理换行符
Jun 08 Python
Python 16进制与中文相互转换的实现方法
Jul 09 Python
python编写简易聊天室实现局域网内聊天功能
Jul 28 Python
解决Django连接db遇到的问题
Aug 29 Python
解决python 读取excel时 日期变成数字并加.0的问题
Oct 08 Python
pytorch制作自己的LMDB数据操作示例
Dec 18 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
Mar 19 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 Python
Python Tornado批量上传图片并显示功能
Mar 26 #Python
python列表删除和多重循环退出原理详解
Mar 26 #Python
执行Python程序时模块报错问题
Mar 26 #Python
python3 正则表达式基础廖雪峰
Mar 25 #Python
python 6.7 编写printTable()函数表格打印(完整代码)
Mar 25 #Python
python实现人机五子棋
Mar 25 #Python
pyqt5数据库使用详细教程(打包解决方案)
Mar 25 #Python
You might like
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
中东人咖啡哲学
2021/03/03 咖啡文化
咖啡冲泡指南 咖啡有哪些制作方式 单品咖啡 意式咖啡
2021/03/06 冲泡冲煮
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
php数组查找函数总结
2014/11/18 PHP
PHP 断点续传实例详解
2017/11/11 PHP
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
用javascript将数据导入Excel示例代码
2014/09/10 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
[01:14]3.19DOTA2发布会 三代刀塔人第二代
2014/03/25 DOTA
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
Python的requests网络编程包使用教程
2016/07/11 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
python 多线程串行和并行的实例
2019/02/22 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
从python读取sql的实例方法
2020/07/21 Python
浅析Python的命名空间与作用域
2020/11/25 Python
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
怎样让char类型的东西转换成int类型
2013/12/09 面试题
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
委托证明的格式
2014/01/10 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
信息技术培训感言
2014/03/06 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
企业整改报告范文
2014/11/08 职场文书
2019学生会干事辞职信
2019/06/27 职场文书
送给火锅店的创意营销方案!
2019/07/08 职场文书
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android