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>Title</title> <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>Title</title> <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>Title</title> <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>Title</title> <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()