对Ajax连接的认识~为毛不能上传文件!!!
最近做毕设的时候需要用到上传图片的功能,但是我的毕设全部的传输都是基于ajax的请求,百度了一圈发现TMD居然说ajax不能上传文件!!当时我就不乐意了啊,那难道其他人都用的是黑科技吗?!又来网上的大牛告诉说用jquery的一个插件就可以完成,百度了一下原来叫--ajaxfileupload.js
这又是个什么鬼!(╯‵□′)╯︵┴─┴为毛要用插件,来来来~ajax咋俩聊聊,你为毛不能上传文件来着?
对于ajax是如何实现的我想大家都很清楚了,首先得到XmlHttpRequest对象实例的一个引用,可以创建一个新的XmlHttpRequest的实例。然后告诉XmlHttpRequest对象,那个函数回处理XmlHttpRequest对象的状态的改变.为此要把对象的 onreadystatechange属性设置为指向JavaScript的指针.接着指定请求属性.XmlHttpRequest对象的Open()方法会指定将发送的请求.最后将请求发送给服务器.XmlHttpRequest对象的send()方法将请求发送到目标资源。下面是我在某前辈的博客里找到的图片,这样更直观一些,谢谢~

属性ajax的人肯定对XmlHttpRequest 对象不陌生吧,度娘告诉我说ajax的核心就是这个对象,那么我们就来看看XmlHttpRequest对象是如何上传数据的吧~
// 首先我们先创建一个对象咯
var xmlHttp;
function createXMLHttpRequest(){
if(window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest();
}
}
// 接着我们定义发送请求的方法
function AddNumber(){
createXMLHttpRequest();
var url= "AddHandler.ashx?num1="+document.getElementById("num1").value+
"&num2="+document.getElementById("num2").value;
xmlHttp.open("GET",url,true);
xmlHttp.onreadystatechange=ShowResult;
xmlHttp.send(null);
}
当然,ajax还有很多可说的,但是今天在这里单纯的是讨论一下在ajax中数据到底是如何发送到后台的呢?看过很多前辈的博客和文档上都说其实ajax发送的是字符类型的对象,那这样就很好理解为什么无法上传文件这样二进制的东西了~比较不能把二进制转成字符串发吧…..(说不定真能额…..)但是又看到又说现在的HTML5可以原生的上传文件了,不过目前不是所有浏览器都支持的呀~那还不能算是彻彻底底的解决方案咯~
既然不能上传二进制文件,那之前的神器--ajaxfileupload.js又是如何完成这个看似“不可能”的任务的呢?
打开ajaxfileupload.js就会很明白的看懂里面说的啦~这样引用一位前辈的博客http://blog.csdn.net/it_man/article/details/43800957这里面有对这个js很详细的说明了,说白了~原来这个神器也不是通过ajax的方式上传的呀~其实,这个插件的原理就是动态的生成一个隐藏的iframe来提交的数据,在数据提交完成后再悄悄的删除掉,可是在我实际的使用中发现这个插件一次只能上传一个文件额,对于有多文件上传需求的我来说很不和谐额(╯‵□′)╯︵┴─┴
那我们就来改造改造这个插件吧~为什么一次只能上传一个呢?是因为在插件中作者一次只取了一个元素的ID,那么我们就让它一次多取几个ID吧~
//var oldElement = jQuery('#' + fileElementId);
//var newElement = jQuery(oldElement).clone();
//jQuery(oldElement).attr('id', fileId);
//jQuery(oldElement).before(newElement);
//jQuery(oldElement).appendTo(form);
if(typeof(fileElementId) == 'string'){
fileElementId = [fileElementId];
}
for(var i in fileElementId){
var oldElement = jQuery('#' + fileElementId[i]);
var newElement = jQuery(oldElement).clone();
jQuery(oldElement).attr('id', fileId);
jQuery(oldElement).before(newElement);
jQuery(oldElement).appendTo(form);
}
下面被我注释掉的地方就是作者原来写的,而我在下面从新改的是首先判断传人的值是否是一个字符串,如果是字符串那么就继续按照以前的方式来处理,而当上传多个文件的时候就通过循环来一个个的取出添加,这样既保持了原理的写法,也同时兼容了多个ID的传人。
fileElementId: 'fileID',//这是原始的使用方法,一次传人一个值 fileElementId:['file1','file2','file3'],//这个是新的写法,一个数组的形式
这样就完成了我们的需求啦~那么今天的记录就到这里了~其实这些都已经是烂大街的东西了,很多地方都有说明了,我在这里记录的并不仅仅是如何去使用,而且我踩坑的这次过程,如何思考,如何去想解决办法~o(╯□╰)o希望以后能像这些前辈一样早发现早治疗了~
对Ajax连接的认识~为毛不能上传文件!!!的更多相关文章
- ajaxfileupload原理及用法,主要用于即想用ajax序列化传递参数,又必须上传文件
一,原理 AjaxFileUpload.js并不是一个很出名的插件,只是别人写好的放出来供大家用,原理都是创建隐藏的表单和iframe然后用JS去提交,获得返回值. 当初做了个异步上传的功能,选择它因 ...
- ajax +jsp+iframe无刷新上传文件[转]
http://hi.baidu.com/zj360202/blog/item/f23e3711f929c774cb80c475.html ajax jsp 无刷新上传文件 2009-10-26 16: ...
- 通过Ajax提交form表单来提交上传文件
Ajax 提交form方式可以将form表单序列化 然后将数据通过data提交至后台,例如: $.ajax({ url : "http://localhost:8080/" ...
- Xftp连接阿里云Linux,向Linux上传文件,Windows和Linux文件传输
我之前是用SecureCRT连接阿里云Linux的,上传文件用的Alt+p快捷键,感觉不是很方便.后来朋友给我推荐了Xshell,感觉确实好用得很多. 传输文件用的是Xftp,今天在向我的个人网站发布 ...
- HTML5+AJAX原生分块上传文件的关键参数设置
processData:false 这是jquery.ajax的一个参数.默认值为true,表示会将非字符串对象自动变成k1=v1&k2=v2的形式,例如一个数组参数{d:[1,2]},到服务 ...
- day059-60 ajax初识 登录认证练习 form装饰器, form和ajax上传文件 contentType
一.ajax 的特点 1.异步交互:客户端发出一个请求后,需要等待服务器响应结束后, 才能发出第二个请求 2.局部刷新:给用户的感受是在不知不觉中完成请求和响应过程. 二.ajax 模板示例 ($.a ...
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...
- 巨蟒python全栈开发django11:ajax&&form表单上传文件contentType
回顾: 什么是异步? 可以开出一个线程,我发出请求,不用等待返回,可以做其他事情. 什么是同步? 同步就是,我发送出了一个请求,需要等待返回给我信息,我才可以操作其他事情. 局部刷新是什么? 通过jq ...
- IE8/9 JQuery.Ajax 上传文件无效
IE8/9 JQuery.Ajax 上传文件有两个限制: 使用 JQuery.Ajax 无法上传文件(因为无法使用 FormData,FormData 是 HTML5 的一个特性,IE8/9 不支持) ...
随机推荐
- 进入OS前的两步之PendSV(任务切换)
先了解下如何使用PendSV异常.(为何要使用PendSV而不是其他的异常,请参考<cortex-M3权威指南>) 1,如何设定PendSV优先级? NVIC_SYSPRI14 EQU 0 ...
- javascript parseJSON
解析json: 前台和后台做ajax交互,后台返回的json字符串,我之前都是通过eval来解析,后来慢慢的知道eval这货是魔鬼,eval要尽量避免,是出于安全考虑,因为eval过于强大,他可以把s ...
- PhpStorm 8.x/9.x 快捷键设置/个性化设置,如何多项目共存?如何更换主题?
1."自定义"常用快捷键(设置成跟Eclipse差不多) 按照路径:File -> Settings -> Appearance & Behavior -> ...
- IE 8 下的 box-sizing 和 min-* 属性
在非 IE 浏览器中,默认情况下 width 属性指的是内容区域(content)的宽度. IE 6+ 中,如果浏览器以标准模型渲染,和非 IE 浏览器的表现是一致的:如果浏览器以怪癖模式渲染,则 w ...
- ngCloak 实现 Angular 初始化闪烁最佳实践
在做angular的SPA开发时,我们经常会遇见在如Chrome这类能够快速解析的浏览器上出现表达式({{ express }} ),或者是模块(div)的闪烁.对于这个问题由于JavaScript去 ...
- JS 删除对象属性
updateNode: function(data) { if(data) { this.root[data.id] = data; } }, removeNodes: function(idsArr ...
- SVN 删除误上传到服务器的文件
使用Axure软件的时候,不小心把一些无用的文档也提交到了SVN上了. 当更新服务器上的文件到本地,然后删除误提交的文件时,出现了一个错误,见下图: 错误:cannot verify lock o ...
- ecshop常用二次开发修改
修改ecshop支付宝的支付按钮 http://www.68ecshop.com/article-1081.html 去掉ecshop收货人信息页面的电子邮件必填和电话.手机选填一个 http:/ ...
- Path
<Path Data="M17.5,16.5 L17.5,18.5 19.5,18.5 19.5,16.5 z M11.5,16.5 L11.5,18.5 13.5,18.5 13.5 ...
- eclipse配置jdk的src.zip源代码步骤
MyEclipse配置JDK的源代码的src.zip包很简单.只需要简单的几个步骤. 1.点 “window”-> “Preferences” -> “Java” -> “Insta ...