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正则表达式使用范例分享
Dec 04 Python
使用python和pygame绘制繁花曲线的方法
Feb 24 Python
Python lambda函数基本用法实例分析
Mar 16 Python
Python 2.7中文显示与处理方法
Jul 16 Python
详解python持久化文件读写
Apr 06 Python
Python常用模块之requests模块用法分析
May 15 Python
Django中celery执行任务结果的保存方法
Jul 12 Python
python、PyTorch图像读取与numpy转换实例
Jan 13 Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 Python
keras实现多种分类网络的方式
Jun 11 Python
如何在python中判断变量的类型
Jul 29 Python
python FTP编程基础入门
Feb 27 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 分页函数multi() discuz
2009/06/21 PHP
PHPwind整合最土系统用户同步登录实现方法
2010/12/08 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
PHP+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
ThinkPHP模型详解
2015/07/27 PHP
完整显示当前日期和时间的JS代码
2007/09/17 Javascript
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
python 正则式 概述及常用字符
2009/05/07 Python
Python编码类型转换方法详解
2016/07/01 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
python中map的基本用法示例
2018/09/10 Python
python实现微信自动回复机器人功能
2019/07/11 Python
Django时区详解
2019/07/24 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
Python tornado上传文件的功能
2020/03/26 Python
python实现定时发送邮件
2020/12/23 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
添柏岚英国官方网站:Timberland英国
2019/11/28 全球购物
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
学习雷锋活动总结
2014/04/29 职场文书
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python