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 list语法学习(带例子)
Nov 01 Python
python持久性管理pickle模块详细介绍
Feb 18 Python
Python实现获取照片拍摄日期并重命名的方法
Sep 30 Python
Python+Turtle动态绘制一棵树实例分享
Jan 16 Python
python3.x提取中文的正则表达式示例代码
Jul 23 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
python3的pip路径在哪
Jun 23 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
python实现AdaBoost算法的示例
Oct 03 Python
Python Http请求json解析库用法解析
Nov 28 Python
python 实现Requests发送带cookies的请求
Feb 08 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的计数器程序
2006/10/09 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
JavaScript动态添加css样式和script标签
2016/07/19 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
解决betterScroll在vue中存在图片时,出现拉不动的问题
2018/09/27 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python 动态加载的实现方法
2017/12/22 Python
Django实现文件上传和下载功能
2019/10/06 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
python 实现单通道转3通道
2019/12/03 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
filter使用python3代码进行迭代元素的实例详解
2020/12/03 Python
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
应届毕业生求职信范文
2013/12/18 职场文书
集中采购方案
2014/06/10 职场文书
公司活动总结怎么写
2014/06/25 职场文书
商品陈列协议书
2014/09/29 职场文书
中标通知书
2015/04/17 职场文书
校车安全管理责任书
2015/05/11 职场文书
民事起诉书范本
2015/05/19 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
你离财务总监还有多远?速览CFO的岗位职责
2019/11/18 职场文书
MySQL系列之二 多实例配置
2021/07/02 MySQL