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黑帽子取代netcat
Feb 10 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
Apr 27 Python
python生成密码字典的方法
Jul 06 Python
python使用tornado实现简单爬虫
Jul 28 Python
python对视频画框标记后保存的方法
Dec 07 Python
python实现车牌识别的示例代码
Aug 05 Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
Jun 28 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
Python绘图实现台风路径可视化代码实例
Oct 23 Python
python list的index()和find()的实现
Nov 16 Python
numba提升python运行速度的实例方法
Jan 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 显示客户端IP与服务器IP的代码
2010/10/12 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
心扬JS分页函数代码
2010/09/10 Javascript
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
python放大图片和画方格实现算法
2018/03/30 Python
flask中过滤器的使用详解
2018/08/01 Python
python字符串判断密码强弱
2020/03/18 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
兰蔻英国官网:Lancome英国
2019/04/30 全球购物
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
毕业生个人求职的自我评价
2013/10/28 职场文书
自我评价个人范文
2013/12/16 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
优秀教研组申报材料
2014/12/26 职场文书
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python
SQL Server中搜索特定的对象
2022/05/25 SQL Server
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android