码迷,mamicode.com
首页 > Web开发 > 详细

文件上传---form表单,ajax,jquery

时间:2018-03-09 14:06:44      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:urlencode   click   dir   tag   sed   文本   append   title   __name__   

服务端程序:

技术分享图片
import tornado.web
import os

IMG_LIST=[]

class IndexHandler(tornado.web.RequestHandler):
    def get(self):

        self.render(‘index.html‘,list_img=IMG_LIST)

    def post(self, *args, **kwargs):
        name=self.get_argument(‘name‘)
        pwd=self.get_argument(‘pwd‘)
        #fn=self.get_argument(‘img‘)
        file_meta=self.request.files[‘img‘]
        for meta in file_meta:
            file_name=meta[‘filename‘]
            file_path=os.path.join(‘img‘,file_name);
            IMG_LIST.append(file_path)
            with open(os.path.join(‘static‘,file_path),"wb") as fp:
                fp.write(meta[‘body‘])

        self.write(‘{"status":1,"message":"mmm"}‘)

settings ={
    ‘template_path‘:‘views‘,
    ‘static_path‘:‘static‘,
    ‘static_url_path‘:‘sss‘
}

application = tornado.web.Application([
    (r"/index",IndexHandler),
],**settings)


if __name__=="__main__":
    application.listen(8080)
    tornado.ioloop.IOLoop.instance().start()
View Code

form表单:注意加上enctype="multipart/form-data"

    <form action="/index" method="post" enctype="multipart/form-data">
        <input type="text" name="name"/>
        <input type="text" name="pwd">
        <input type="file" name="img" id="img">
        <input type="submit">
    </form>

js使用ajax上传:

    <button onclick="uploadFile();">ajax上传文件</button>
    function uploadFile(){
        //获取文件对象
        var fileobj=document.getElementById("img").files[0];
        //创建form表单对象
        var form=new FormData();
        form.append(‘name‘, document.getElementsByTagName(‘input‘)[0].value);
        form.append(‘pwd‘, document.getElementsByTagName(‘input‘)[1].value);
        form.append(‘img‘,fileobj);

        var xhr=new XMLHttpRequest();
        xhr.open(‘post‘,‘/index‘,true);
        xhr.send(form);
    }

jquery上传文件:

    <button onclick="uploadFile2();">jquery上传文件</button>
    function  uploadFile2() {
        //先获取文件对象
        var fileObj=$("#img")[0].files[0];
        var form=new FormData();
        form.append(‘name‘, document.getElementsByTagName(‘input‘)[0].value);
        form.append(‘pwd‘, document.getElementsByTagName(‘input‘)[1].value);
        form.append(‘img‘,fileObj);

        $.ajax({
            type:‘post‘,
            url:‘/index‘,
            data:form,
            processData:false,
            contentType:false,
            dataType:‘text‘,
            success:function(data){
                console.log(data);
            }
        })
    }

其中主要注意:

processData设置为false。因为data值是FormData对象,不需要对数据做处理。

processData
类型:Boolean
默认值: true。默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。

 

contentType设置为false。因为是由<form>表单构造的FormData对象,且已经声明了属性enctype="multipart/form-data",所以这里设置为false

在 jquery 的 ajax 中, contentType都是默认的值:application/x-www-form-urlencoded,这种格式的特点就是,name/value 成为一组,每组之间用 & 联接,而 name与value 则是使用 = 连接。

不需要设置的适合使用false

 

 

iframe:上传几乎兼容所有浏览器

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .hide{
            display:none;
        }
    </style>
    <script src="{{static_url(‘js/jquery.js‘)}}"></script>
</head>
<body>
    <form id="my_form" action="/index" method="POST" enctype="multipart/form-data">
        <div id="main">
            <input name="name" type="text"/>
            <input name="pwd" type="text"/>
            <input name="img" id="img" type="file"/>
            <input type="button" name="action" value="Upload" onclick="redirect();">
            <iframe id="my_iframe" name="my_iframe" src="" class="hide"></iframe>
        </div>
    </form>
</body>
</html>
<script>
    function redirect() {
        document.getElementById("my_iframe").onload=Test();
        //target-->目标提交地点iframe,iframe提交页面不刷新
        document.getElementById(‘my_form‘).target=‘my_iframe‘;
        document.getElementById(‘my_form‘).submit();
    }
    function Test() {
        var t=$("#my_iframe").contents().find(‘body‘).text();
        console.log(t);
    }
</script>

如果给定表示 DOM 元素集合的 jQuery 对象,.contents() 方法允许我们检索 DOM 树中的这些元素的直接子节点,并用匹配元素构造新的 jQuery 对象。.contents() 和 .children() 方法类似,不同的是前者在结果 jQuery 对象中包含了文本节点以及 HTML 元素。

.contents() 方法也可以用于获得 iframe 的内容文档,前提是该 iframe 与主页面在同一个域。而children()不能用于iframe 

文件上传---form表单,ajax,jquery

标签:urlencode   click   dir   tag   sed   文本   append   title   __name__   

原文地址:https://www.cnblogs.com/ssyfj/p/8533287.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!