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实现下载网易云音乐的高清MV
Mar 16 Python
python实用代码片段收集贴
Jun 03 Python
Python使用微信SDK实现的微信支付功能示例
Jun 30 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
python+opencv实现阈值分割
Dec 26 Python
Django model select的多种用法详解
Jul 16 Python
使用Python制作一个打字训练小工具
Oct 01 Python
Python类的绑定方法和非绑定方法实例解析
Mar 04 Python
Python logging模块原理解析及应用
Aug 13 Python
通过实例解析python and和or使用方法
Nov 14 Python
分享3个非常实用的 Python 模块
Mar 03 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 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
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
2014/04/21 PHP
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
Javascript中的delete介绍
2012/09/02 Javascript
原生js实现查找/添加/删除/指定元素的class
2013/04/12 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
python中requests模块的使用方法
2015/04/08 Python
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
美国最值得信赖的宠物药房:Allivet
2019/03/23 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
职业生涯规划设计步骤
2014/01/12 职场文书
六一亲子活动总结
2014/07/01 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
Nginx四层负载均衡的配置指南
2021/06/11 Servers
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers