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上传文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!