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学习必备知识汇总
Sep 08 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 Python
Python实现简单的用户交互方法详解
Sep 25 Python
python判断字符串或者集合是否为空的实例
Jan 23 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
May 07 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
python将字符串list写入excel和txt的实例
Jul 20 Python
Pycharm远程调试原理及具体配置详解
Aug 08 Python
python数据库编程 ODBC方式实现通讯录
Mar 27 Python
Django 实现将图片转为Base64,然后使用json传输
Mar 27 Python
Python Request类源码实现方法及原理解析
Aug 17 Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 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
PHPMailer邮件类利用smtp.163.com发送邮件方法
2008/09/11 PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
php中的观察者模式
2010/03/24 PHP
php URL跳转代码 减少外链
2011/06/25 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
php中的登陆login实例代码
2016/06/20 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
2015/08/19 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
p5.js 毕达哥拉斯树的实现代码
2018/03/23 Javascript
nodejs log4js 使用详解
2019/05/31 NodeJs
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
python组合无重复三位数的实例
2018/11/13 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
python为什么要安装到c盘
2020/07/20 Python
酒吧创业计划书
2014/01/18 职场文书
销售员岗位职责
2014/06/09 职场文书
理财学专业自荐书
2014/06/28 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
2015年销售部工作总结范文
2015/04/27 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏