第二百七十三節,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>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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM