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

 

posted @ 2017-05-26 14:50  林贵秀  阅读(6630)  评论(0编辑  收藏  举报