Python tornado上传文件的功能 ajax上传 及 ajaxfileupload.js实现

这篇文章主要介绍了Python tornado上传文件的功能,代码分为普通上传和ajax上传,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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上传

      <div class="col-sm-6 bsselect" >
		<!-- <div class="sub">上传</div> -->
          <label  class="btn btn-primary selectfile" onclick="selectfile()">选择文件</label>
          <form action='uploadfile' enctype="multipart/form-data" method='post' style="display: none;">
            <input type='file' class="btn btn-primary fileupload"   name='file'/>
            <input type='button' class="btn btn-default submit"  id="submit" style="display:none" value='开始解析'/>
            </form>
          <!-- <select class="selectpicker  b-select taskTpye"  multiple data-live-search="true"  title="请选择..."  onchange="selecttaskType(this)" id="taskType"
          data-selected-text-format="count > 3" data-width="200px" data-actions-box="true" data-style="btn-select">
          </select> -->
      </div>
      <div class="col-sm-6 bsselect" >
          <label  class="btn btn-default sub" onclick="search()">开始解析</label>
          <!-- <select class="selectpicker  b-select taskStatus"  multiple data-live-search="true"  title="请选择..."  onchange="selecttaskStatus(this)" id="taskStatus"
          data-selected-text-format="count > 3" data-width="200px" data-actions-box="true" data-style="btn-select">
          </select> -->
      </div>
      <div class="col-sm-6 bsselect textN" >
        <label  class="textname"></label>
    </div>


$(function () {
  var file = "";
  var fileName = "";
  var fileExt = "";
  $(".fileupload").change(function () {
      //获取文件的value值
      file = $(".fileupload").val()
      //获取文件名+扩展名
      // fileName = file.split("\\").pop();
      //获取文件名
      // fileName = fileName.substring(0, fileName.lastIndexOf("."));
       //获取文件的扩展名
      fileExt = file.substr(file.lastIndexOf("."));
      console.log(fileExt)
      var extList=['.xlsx']
      if(extList.indexOf(fileExt)>-1){  
      //清空DIV容器内容
      $(".textname").html("");
      $(".textname").append(file);}else{$.alert("提示信息","文件类型不支持...")}
      if(file){$(".textN").css({display:"inline"})}else{$(".textN").css({display:"none"})}
  })
});

function selectfile () {
  $(".fileupload").click()
};

function search(){
  const url ="uploadfile"
  filename=$(".textname").text()
  // file=$(".fileupload")[0].files
  var files = $('.fileupload').prop('files');
  if (filename){
  $('.sub').click(function(){
    var form = $('form')[0];
    var formData = new FormData(form);
    formData.append('file', $('.fileupload')[0].files[0]);
    formData.append('filename', $('.fileupload').val());
    $.ajax({
      url: url,
      data: formData,
      type: 'POST',
      contentType: false,
      processData: false,
      success: function(data){
        var jsondata = JSON.parse(data);
        if(jsondata.Result){
          $.alert("提示信息","操作数据成功...");
          content=jsondata.Content
          while($(".projects tr").length>1){
            del()
          }
          content.data.forEach(e => {
            add(e)
          });
        }else{
      $.alert("提示信息","无数据信息...");
        }
      },
      error: function(data){
        var obj = jQuery.parseJSON(data);
        alert(data.result);
      }
    })
  });
}else{$.alert("提示信息","没有选择文件..."); }
  // uploadfile(url,datas)
  function uploadfile(url,data){
    Url =HOST+url
    // data["_xsrf"]=getCookie("_xsrf")
    strdata = JSON.stringify(data);  
    $.post(Url,strdata)
    .done( function(data){
      jsondata=JSON.parse(data)
      if(jsondata.Result){
        content=jsondata.Content
        while($(".projects tr").length>2){
          del()
        }
        content.forEach(e => {
          add(e)
        });
      }else{
        // alert("Network Error !")
		$.alert("提示信息","无数据信息...");

      }
    })
    .fail(function(xhr,errorText,errorType){
            // console.log(xhr,errorText,errorType);
            if(xhr.status=='403'){
              window.location.replace(HOST+"login");
            }
            if(errorText){
              // alert("Network Error !")
		      $.alert("提示信息","网络链接失败...");

            }
            
    });
  }

//   function getCookie(name) {
//     var r = document.cookie.match("\\b"+name+"=([^:]*)\\b");
//     return r ? r[1] : undefined;
// }

  // $.ajax({
  //           type : "POST",
  //           url : Url, 
  //           data :strdata,
  //           contentType : "application/x-www-form-urlencoded",
  //           success : function(data){
  //             if (!data){
  //               alert("Network  Error")
  //             }
  //                 var result=data.Content
  //                 // var result=str.slice(1,-1)
  //                 // var result=str.substr(0,str.length-1)
  //                 console.log(typeof data,typeof result,result);
  //                 result.forEach(function(value){     
  //                   add(value)
  //                 })
  //                 },
  //           error:function(xhr,errorText,errorType){
  //                   alert(xhr,errorText,errorType)
  //                 },
  //               })


}

方法2:使用 ajaxfileupload.js

<script src="jquery.js"></script>
<script src="ajaxfileupload.js"></script>
<script type="text/javascript">
    $("#doUpload").click(function(){
        $.ajaxFileUpload({
            url:'/demo/upload',
            secureuri:false,
            fileElementId:'wiki_img',
            dataType: 'json',
            success: function(data){
                alert(data);
            }
        });
    });
</script>

采用ajax上传,需要修改一下前端发送请求的方式。可参照如下方式:

注意

tornado处理文件上传时,会把整个文件放在内存中。
如果有上传大文件的需求,一般会使用nginx的文件上传模块 (第三方模块,需要编译)。

总结

到此这篇关于Python tornado上传文件的功能的文章就介绍到这了,更多相关Python tornado上传文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值