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 相关文章推荐
在Django框架中编写Context处理器的方法
Jul 20 Python
5种Python单例模式的实现方式
Jan 14 Python
windows及linux环境下永久修改pip镜像源的方法
Nov 28 Python
Python实现的文本简单可逆加密算法示例
May 18 Python
python 中if else 语句的作用及示例代码
Mar 05 Python
Python使用pickle模块实现序列化功能示例
Jul 13 Python
python中reader的next用法
Jul 24 Python
Windows下Python3.6安装第三方模块的方法
Nov 22 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
在PYQT5中QscrollArea(滚动条)的使用方法
Jun 14 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
Python中的流程控制详解
Feb 18 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中获取url与物理路径的总结
2013/06/21 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
Bootstrap表单制作代码
2017/03/17 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
two.js之实现动画效果示例
2017/11/06 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
详解vue 不同环境配置不同的打包命令
2019/04/07 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
vue.js实现简单购物车功能
2020/05/30 Javascript
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
python 切换root 执行命令的方法
2019/01/19 Python
python3.x实现base64加密和解密
2019/03/28 Python
django ModelForm修改显示缩略图 imagefield类型的实例
2019/07/28 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
美国知名日用品连锁超市:Dollar General(多来店)
2017/01/14 全球购物
施华洛世奇天猫官方旗舰店:SWAROVSKI
2017/04/17 全球购物
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
Shell编程面试题
2012/05/30 面试题
生产主管岗位职责
2013/11/10 职场文书
财务主管自我鉴定
2014/01/17 职场文书
2015年公司新年寄语
2014/12/08 职场文书
入党现实表现材料
2014/12/23 职场文书
学校食品安全责任书
2015/01/29 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书