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中使用asyncio 封装文件读写
Sep 11 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
Python并行分布式框架Celery详解
Oct 15 Python
python中时间模块的基本使用教程
May 14 Python
python tkinter实现界面切换的示例代码
Jun 14 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
python matplotlib包图像配色方案分享
Mar 14 Python
基于matplotlib中ion()和ioff()的使用详解
Jun 16 Python
python爬虫构建代理ip池抓取数据库的示例代码
Sep 22 Python
Django中使用Celery的方法步骤
Dec 07 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
Jan 15 Python
python解决OpenCV在读取显示图片的时候闪退的问题
Feb 23 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
javascript 多级checkbox选择效果
2009/08/20 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
js中this用法实例详解
2015/05/05 Javascript
Bootstrap弹出框(modal)垂直居中的问题及解决方案详解
2016/06/12 Javascript
js模拟微博发布消息
2017/02/23 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
vue滚动轴插件better-scroll使用详解
2017/10/17 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
JavaScript如何借用构造函数继承
2019/11/06 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
java直接调用python脚本的例子
2014/02/16 Python
python提取内容关键词的方法
2015/03/16 Python
分析在Python中何种情况下需要使用断言
2015/04/01 Python
Python中用Spark模块的使用教程
2015/04/13 Python
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
详解python的argpare和click模块小结
2019/03/31 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
党员学习十八大感想
2014/01/17 职场文书
房产继承公证书
2014/04/09 职场文书
《秋游》教学反思
2014/04/24 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
献爱心大型公益活动策划方案
2014/09/15 职场文书
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android