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中设置变量作为默认值时容易遇到的错误
Apr 03 Python
Python使用Redis实现作业调度系统(超简单)
Mar 22 Python
教你用Python写安卓游戏外挂
Jan 11 Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 Python
Python使用修饰器进行异常日志记录操作示例
Mar 19 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
Django工程的分层结构详解
Jul 18 Python
python实现最小二乘法线性拟合
Jul 19 Python
elasticsearch python 查询的两种方法
Aug 04 Python
Python-numpy实现灰度图像的分块和合并方式
Jan 09 Python
python Yaml、Json、Dict之间的转化
Oct 19 Python
利用Python实现模拟登录知乎
May 25 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 Class&amp;Object -- 解析PHP实现二叉树
2013/06/25 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
php实现的短网址算法分享
2014/06/20 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
Angularjs 滚动加载更多数据
2016/03/17 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
2019/06/03 Javascript
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
Python书单 不将就
2017/07/11 Python
zookeeper python接口实例详解
2018/01/18 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
对Python实现累加函数的方法详解
2019/01/23 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
Python使用进程Process模块管理资源
2020/03/05 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
2014教师专业技术工作总结
2014/12/03 职场文书
公司经营目标责任书
2015/01/29 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
解决redis批量删除key值的问题
2022/03/23 Redis