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实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
Jul 11 Python
Python中unittest用法实例
Sep 25 Python
优化Python代码使其加快作用域内的查找
Mar 30 Python
利用python发送和接收邮件
Sep 27 Python
Windows下安装python2和python3多版本教程
Mar 30 Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 Python
在PyCharm中三步完成PyPy解释器的配置的方法
Oct 29 Python
python中的协程深入理解
Jun 10 Python
python的Jenkins接口调用方式
May 12 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
May 22 Python
python实现简单猜单词游戏
Dec 24 Python
Python内置类型集合set和frozenset的使用详解
Apr 26 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
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
2016/06/13 Javascript
vue-hook-form使用详解
2017/04/07 Javascript
BootStrap 导航条实例代码
2017/05/18 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
JS实现的视频弹幕效果示例
2018/08/17 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
Sublime开发python程序的示例代码
2018/01/24 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
大学四年规划书范文
2013/12/27 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
皇城相府导游词
2015/02/06 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
工作时间证明
2015/06/15 职场文书
党员学习中国梦心得体会
2016/01/05 职场文书
《地震中的父与子》教学反思
2016/02/16 职场文书
MySQL学习之基础命令实操总结
2022/03/19 MySQL