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生成文件md5校验值函数的方法
Jan 10 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
Python+request+unittest实现接口测试框架集成实例
Mar 16 Python
Python中Numpy包的安装与使用方法简明教程
Jul 03 Python
Python实现简单石头剪刀布游戏
Jan 20 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
Python面向对象原理与基础语法详解
Jan 02 Python
Python自动采集微信联系人的实现示例
Feb 28 Python
Python中关于logging模块的学习笔记
Jun 03 Python
Python Socket多线程并发原理及实现
Dec 11 Python
Pyside2中嵌入Matplotlib的绘图的实现
Feb 22 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
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
jquery 元素相对定位代码
2010/10/15 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
2013/01/21 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
jquery实现点击页面计算点击次数
2015/01/23 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
2020/08/27 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
Bootstrap表单布局
2016/07/19 Javascript
Vuejs第十篇之vuejs父子组件通信
2016/09/06 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
AngularJS实现tab选项卡的方法详解
2017/07/05 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
Python的Flask框架应用程序实现使用QQ账号登录的方法
2016/06/07 Python
有关Python的22个编程技巧
2018/08/29 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
医院总经理岗位职责
2014/02/04 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
求职信范文怎么写
2015/03/19 职场文书
普通员工辞职信范文
2015/05/12 职场文书
运动会开幕式致辞
2015/07/29 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python