第二百七十三节,Tornado框架-文件上传
Tornado框架-文件上传
第一、普通表单上传文件
self.request.files["fafafa"] 获取上传文件信息,参数["上传文件框的name名称"]
['filename']获取上传文件的名称
['body']获取上传文件的内容
框架引擎
#!/usr/bin/env python #coding:utf-8 import tornado.ioloop import tornado.web #导入tornado模块下的web文件 class dluHandler(tornado.web.RequestHandler): def get(self): self.render("dlu.html") def post(self): file_metas = self.request.files["fafafa"] #获取上传文件信息 for meta in file_metas: #循环文件信息 file_name = meta['filename'] #获取文件的名称 import os #引入os路径处理模块 with open(os.path.join('statics','img',file_name),'wb') as up: #os拼接文件保存路径,以字节码模式打开 up.write(meta['body']) #将文件写入到保存路径目录 settings = { #html文件归类配置,设置一个字典 "template_path":"views", #键为template_path固定的,值为要存放HTML的文件夹名称 "static_path":"statics", #键为static_path固定的,值为要存放js和css的文件夹名称 } #路由映射 application = tornado.web.Application([ #创建一个变量等于tornado.web下的Application方法 (r"/dlu", dluHandler), ],**settings) #将html文件归类配置字典,写在路由映射的第二个参数里 if __name__ == "__main__": #内部socket运行起来 application.listen(8888) #设置端口 tornado.ioloop.IOLoop.instance().start()
html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script type="text/javascript" src='{{static_url("jquery.min.js")}}' charset="UTF-8">script>
head>
<body>
<form id="my_form" name="form" action="/dlu" method="POST" enctype="multipart/form-data">
<div id="main">
<input name="favor" type="text"/>
<input name="fafafa" id="my_file" type="file"/>
<input type="submit" value="提交"/>
div>
form>
body>
html>
第二、jquery的ajax上传文件
注意:FormData();创建表单对象兼容性不好,不推荐
html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script type="text/javascript" src='{{static_url("jquery.min.js")}}' charset="UTF-8">script>
head>
<body>
<input class="shchlj" type="text" name="luj"/>
<input type="file" id="img" />
<input type="button" value="上传" onclick="UploadFile();" />
<script>
function UploadFile(){
var fileObj = $("#img")[0].files[0]; //获取上传文件名称
var form = new FormData(); //创建表单对象
form.append("k1", "v1"); //向表单对象添加name和value
form.append("fff", fileObj); //向表单对象添加name和value,将上传文件名称添加到value
$.ajax({ //jquery的ajax提交
type: 'POST',
url: '/dlu',
data: form, //提交数据为表单对象
processData: false, //默认为 true,数据被处理为 URL 编码格式。如果为 false,则阻止将传入的数据处理为 URL 编码的格式。
contentType: false, //指 定 请 求 内 容 的 类 型
success: function (response, status, xhr) { //提交成功
$('.shchlj').val(response) //将返回文件的服务器上传路径,添加到输入框值
},
error: function (xhr, errorText, errorStatus) { //如果发生错误,返回错误信息
}
})
}
script>
body>
html>
框架引擎
#!/usr/bin/env python #coding:utf-8 import tornado.ioloop import tornado.web #导入tornado模块下的web文件 import session_lei #导入session模块 class dluHandler(tornado.web.RequestHandler): def get(self): self.render("dlu.html") def post(self): file_metas = self.request.files["fff"] #获取上传文件信息 for meta in file_metas: #循环文件信息 file_name = meta['filename'] #获取文件的名称 import os #引入os路径处理模块 with open(os.path.join('statics','img',file_name),'wb') as up: #os拼接文件保存路径,以字节码模式打开 up.write(meta['body']) #将文件写入到保存路径目录 self.write(os.path.join('statics','img',file_name)) #将上传好的路径返回 settings = { #html文件归类配置,设置一个字典 "template_path":"views", #键为template_path固定的,值为要存放HTML的文件夹名称 "static_path":"statics", #键为static_path固定的,值为要存放js和css的文件夹名称 } #路由映射 application = tornado.web.Application([ #创建一个变量等于tornado.web下的Application方法 (r"/dlu", dluHandler), ],**settings) #将html文件归类配置字典,写在路由映射的第二个参数里 if __name__ == "__main__": #内部socket运行起来 application.listen(8888) #设置端口 tornado.ioloop.IOLoop.instance().start()
第三、利用iframe框架上传文件
html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script type="text/javascript" src='{{static_url("jquery.min.js")}}' charset="UTF-8">script>
head>
<body>
<form id="my_form" name="form" action="/dlu" method="POST" enctype="multipart/form-data">
<div id="main">
<input class="shchlj" type="text" name="luj"/>
<input name="fff" id="my_file" type="file"/>
<input type="button" name="action" value="Upload" onclick="redirect()"/>
<iframe style="display: none;" id='my_iframe' name='my_iframe' src="" class="hide">iframe>
div>
form>
<script>
function redirect() {
document.getElementById('my_iframe').onload = Testt; //等待框架加载完成后执行Testt函数
document.getElementById('my_form').target = 'my_iframe'; //target属性告诉浏览器希望将所链接的资源显示在哪里,提交后返回数据将显示到框架里
document.getElementById('my_form').submit(); //执行提交方法
}
function Testt(ths) { //框架加载完成后执行Testt函数
var t = $("#my_iframe").contents().find("body").text(); //contents(),获取某元素下面所有元素节点,包括文本节点,如果是 iframe,则可以查找文本内容,集合元素
$('.shchlj').val(t); //获取框架里的返回内容,写入输入框
}
script>
body>
html>
框架引擎
#!/usr/bin/env python #coding:utf-8 import tornado.ioloop import tornado.web #导入tornado模块下的web文件 import session_lei #导入session模块 class dluHandler(tornado.web.RequestHandler): def get(self): self.render("dlu.html") def post(self): file_metas = self.request.files["fff"] #获取上传文件信息 for meta in file_metas: #循环文件信息 file_name = meta['filename'] #获取文件的名称 import os #引入os路径处理模块 with open(os.path.join('statics','img',file_name),'wb') as up: #os拼接文件保存路径,以字节码模式打开 up.write(meta['body']) #将文件写入到保存路径目录 self.write(os.path.join('statics','img',file_name)) #将上传好的路径返回 settings = { #html文件归类配置,设置一个字典 "template_path":"views", #键为template_path固定的,值为要存放HTML的文件夹名称 "static_path":"statics", #键为static_path固定的,值为要存放js和css的文件夹名称 } #路由映射 application = tornado.web.Application([ #创建一个变量等于tornado.web下的Application方法 (r"/dlu", dluHandler), ],**settings) #将html文件归类配置字典,写在路由映射的第二个参数里 if __name__ == "__main__": #内部socket运行起来 application.listen(8888) #设置端口 tornado.ioloop.IOLoop.instance().start()
第四、jquery.form.js表单插件上传文件【推荐】
html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script type="text/javascript" src='{{static_url("jquery.min.js")}}' charset="UTF-8">script>
<script type="text/javascript" src='{{static_url("jquery.form.js")}}' charset="UTF-8">script>
head>
<body>
<form id="my_form" name="form" action="/dlu" method="POST" enctype="multipart/form-data">
<div id="main">
<input class="shchlj" type="text" name="luj"/>
<input name="fff" id="my_file" type="file"/>
<input type="submit" value="上传"/>
div>
form>
<script>
$('#my_form').ajaxForm({ //jquery.form.js,表单提交插件,会自动阻止跳转
url: '/dlu', //设置提交的 url,可覆盖 action 属性
type: 'POST', //GET,POST
beforeSubmit: function (formData, jqForm, options) { //提交前的验证
},
success: function (responseText, statusText) { //提交成功后的操作
$('.shchlj').val(responseText); //将服务器返回路径写入输入框
},
error: function (event, errorText, errorType) { //错误时调用,提交失败的操作
}
});
script>
body>
html>
框架引擎
#!/usr/bin/env python #coding:utf-8 import tornado.ioloop import tornado.web #导入tornado模块下的web文件 import session_lei #导入session模块 class dluHandler(tornado.web.RequestHandler): def get(self): self.render("dlu.html") def post(self): file_metas = self.request.files["fff"] #获取上传文件信息 for meta in file_metas: #循环文件信息 file_name = meta['filename'] #获取文件的名称 import os #引入os路径处理模块 with open(os.path.join('statics','img',file_name),'wb') as up: #os拼接文件保存路径,以字节码模式打开 up.write(meta['body']) #将文件写入到保存路径目录 self.write(os.path.join('statics','img',file_name)) #将上传好的路径返回 settings = { #html文件归类配置,设置一个字典 "template_path":"views", #键为template_path固定的,值为要存放HTML的文件夹名称 "static_path":"statics", #键为static_path固定的,值为要存放js和css的文件夹名称 } #路由映射 application = tornado.web.Application([ #创建一个变量等于tornado.web下的Application方法 (r"/dlu", dluHandler), ],**settings) #将html文件归类配置字典,写在路由映射的第二个参数里 if __name__ == "__main__": #内部socket运行起来 application.listen(8888) #设置端口 tornado.ioloop.IOLoop.instance().start()