服务端程序:

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()
tornado.ioloop.IOLoop.instance().start()

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[];
//创建form表单对象
var form=new FormData();
form.append('name', document.getElementsByTagName('input')[].value);
form.append('pwd', document.getElementsByTagName('input')[].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")[].files[];
var form=new FormData();
form.append('name', document.getElementsByTagName('input')[].value);
form.append('pwd', document.getElementsByTagName('input')[].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。

补充:在Django下:

data:{a:,b:,csrfmiddlewaretoken:'{{ csrf_token }}'},

默认获取为:processData:true
<QueryDict: {u'a': [u''], u'csrfmiddlewaretoken': [u'darHnLiXqB0f4r25nenCAsNdMhT1ms3qTes1l8c509Lu7uWeGg4IBCZXmLpXKkzW'], u'b': [u'']}>
processData:false

此时:获取数据类型为
<QueryDict: {u'[object Object]': [u'']}>

相对于:

processData声明当前的data数据是否进行转码或预处理,默认为true,即预处理;
# 如果为false,那么对data:{a:1,b:2}会调用json对象的toString()方法,即{a:1,b:2}.toString()
# ,最后得到一个[object,Object]形式的结果。
       #如果为false,会将未处理的数据(类型为对象)传递过去,而且没有对应的值,只有该对象,所以会在服务器获得{u'[object Object]': [u'']}样式的数据
# {"1":"111","2":"222","3":"333"}.toString();//[object Object]
# 该属性的意义在于,当data是一个dom结构或者xml数据时,我们希望数据不要进行处理,直接发过去,
# 就可以讲其设为true。

补错:ajax对于post传输数据的处理方法并不是简单的toString,而是其他方法:参见源码:

s = jQuery.ajaxSetup( {}, options ),
// Convert data if not already a string
if ( s.data && s.processData && typeof s.data !== "string" ) {
s.data = jQuery.param( s.data, s.traditional ); #traditional是否允许传递迭代数据
}

所以我们测试processData时可以使用:

正常使用:

    function send_ajax(){
console.log(tt)
$.ajax({
type:'POST',
url:'/get_ajax',
data:{a: , b: , csrfmiddlewaretoken: '{{ csrf_token }}'},
processData:true, #默认为true,会对上面的data对象进行处理,转换为字符串
dataType:'text',
success:function(data){
console.log(data);
}
})
}

稍作处理:我们自己对对象数据进行处理,转换为字符串,不需要非得将processData设置为true,也可以将数据传递过去(不需要注释掉settings.py中'django.middleware.csrf.CsrfViewMiddleware',了,也可以传递过去)

function send_ajax(){
tt = {a: , b: , csrfmiddlewaretoken: '{{ csrf_token }}'};
tt = jQuery.param( tt, false );
console.log(tt)
     //a=1&b=2&csrfmiddlewaretoken=Pd6dDAurbbEemf5B6UGUrlAlXvE3BWY6zWA4yeCPR9jbwNuqb62u3OZvuhL5RAff
$.ajax({
type:'POST',
url:'/get_ajax',
data:tt,
processData:false,
dataType:'text',
success:function(data){
console.log(data);
}
})
}

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

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

不需要设置的适合使用false

contentType:默认值: "application/x-www-form-urlencoded"。发送信息至服务器时内容编码类型。
# 用来指明当前请求的数据编码格式;urlencoded:?a=&b=;如果想以其他方式提交数据,
# 比如contentType:"application/json",即向服务器发送一个json字符串:
# $.ajax("/ajax_get",{
#
# data:JSON.stringify({
# a:,
# b:
# }),
# contentType:"application/json",
# type:"POST",
#
# }); //{a: 22, b: 33} # 注意:contentType:"application/json"一旦设定,data必须是json字符串,不能是json对象

traditional:允许传递迭代数据:

 traditional:一般是我们的data数据有数组时会用到 :data:{a:,b:,c:["x","y"]},
traditional为false会对数据进行深层次迭代;

更多参数请看:http://jquery.cuishifeng.cn/jQuery.Ajax.html

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'; #这里可以直接写在HTML中,在form中添加上target="my_iframe"即可
document.getElementById('my_form').submit();
}
function Test() {
var t=$("#my_iframe").contents().find('body').text();  #表单提交以后会触发test函数,这里去获取服务端回送的数据
    //var t=this.contentWindow.document.body.innerHtml;  也可以
console.log(t);
    

var content=this.contentWindow.document.body.innerHTML;
var obj = JSON.parse(content); #服务器发送过来的是json数据,包含自定义状态码,图片路径 var tag = document.createElement("img");
tag.src = obj.data; #data中是图片路径 $("#my_iframe").empty().append(tag); #先清空原来数据,在加入新的标签

iframe显示图片

    }
</script>

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

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

文件上传---form表单,ajax,jquery,以及iframe无刷新上传 (processData,contentType讲解)的更多相关文章

  1. php form表单ajax上传图片方法

    form表单ajax上传图片方法 先引用jquery.form.js 前台代码<pre><form id="form1"> <input id=&qu ...

  2. Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查

    本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...

  3. PHP 后台程序配置config文件,及form表单上传文件

    一,配置config文件 1获取config.php文件数组, 2获取form 表单提交的值 3保存更新config.php文件,代码如下: $color=$_POST['color']; $back ...

  4. 前端 HTML form表单标签 input标签 type属性 file 上传文件

     加上上传文件功能 input type='file' - 依赖form表单里一个属性 enctype="multipart/form-data" 加上这个属性表示把你上次文件一点 ...

  5. 项目回顾1-图片上传-form表单还是base64-前端图片压缩

    第一个项目终于上线了,是一个叫亲青筹的公益众筹平台,微信端,电脑端还有后台界面大部分都是我完成的,几个月过来,感觉收获了很多,觉得要总结一下. 首先想到的是图片上传的问题.在通常表单数据都是ajax上 ...

  6. Form表单利用Jquery Validate验证以及ajax提交

    #表单利用Jquery验证验证以及ajax提交 概述>详细讲解表单利用Jquery >验证验证以及ajax提交的过程,以及Validate的自定义提示语,非空判断,输入字段的远程ajax验 ...

  7. form表单ajax提交

    这里下面有两种  第一种是form表单里面添加了数据,并且含有上传的图片,第二种是from表单中不含有图片  只有普通数据 第一种form表单中包含有图片的类型: <form method=&q ...

  8. 通过Ajax使用FormData对象无刷新上传文件

    写在前面:本文说的这个方案有浏览器兼容性问题:所有主流浏览器的较新版本已经支持这个对象了,比如Chrome 7+.Firefox 4+.IE 10+.Opera 12+.Safari 5+,对兼容性比 ...

  9. (转)通过Ajax使用FormData对象无刷新上传文件

    写在前面:本文说的这个方案有浏览器兼容性问题:所有主流浏览器的较新版本已经支持这个对象了,比如Chrome 7+.Firefox 4+.IE 10+.Opera 12+.Safari 5+,对兼容性比 ...

随机推荐

  1. JavaScript 字符串与数组互转,并保持数据去重、排序功能

    var valueArr = new Array(); if( $("input[name='type']").val() != ""){ valueArr = ...

  2. Linux 下如何知道是否有人在使坏?

    在 Linux 下查看用户的行为,不仅仅是网管要做的事,也是开发人员所应该具备的基本技能之一.为什么呢?因为有时其他同事在做一些很消耗资源的事情,比如在编译大型程序,可能会导致服务器变得很慢,从而影响 ...

  3. DVWA的安装与简单使用

    参考资料: http://www.freebuf.com/articles/web/119150.html 尝试使用linux机器安装,但是因为下载php版本以及各种兼容性的问题耗时较长, 所以后来选 ...

  4. Linux大页内存管理等---菜鸟初学

    1. 查看linux的内存情况: free -m 2. 查看是否开启大页的方法: cat /proc/meminfo |grep -i HugePage AnonHugePages: 276480 k ...

  5. 小项目分析之C++ 实现模拟银行排队

      一.问题定义与分析 问题定义 •要解决的问题——银行一天之内的: 1.总客户数 2.客户总逗留时间 3.客户平均逗留时间 问题分析 •新来的人找个短的队伍,站在队尾开始排队 •排在队头的人可以办理 ...

  6. 机器学习中的降维算法:ISOMAP & MDS

    参见:https://blog.csdn.net/Dark_Scope/article/details/53229427

  7. Nginx referer防盗链模块

    L75 referer模块 ngx_http_referer_module 默认编译进nginx valid_referers 指令 Syntax: valid_referers none | blo ...

  8. 国产首款5G手机抢先亮相:如此给力的说!

    5G网络是接下来移动互联网发展的主旋律,各家都在努力跟进,目前最积极的当属手机厂商,而2019年我们就能看到多款5G手机降临了. 在11月27日的未来信息通信技术国际研讨会上,vivo展示了他们正在研 ...

  9. Cookie 类

    最近项目中用到cookie,所以就写了个cookie帮助类 public class CookHelper { HttpResponseBase Response = null; HttpReques ...

  10. BZOJ5294 [BJOI2018] 二进制 【线段树】

    BJOI的题目感觉有点难写 题目分析: 首先推一波结论.接下来的一切都在模3意义下 现在我们将二进制位重组,不难发现的是2^0≡1,2^1≡2,2^2≡1,2^3≡2....所以我们考虑这样的式子 2 ...