对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 不支持) ...
随机推荐
- java中的equals()方法重写
如何java中默认的equals方法跟实际不符的话,需要重写equals方法.例如: public class TestEquals { public static void main(String[ ...
- c++11 中成员变量初始化的顺序
参考C++11FAQ https://www.chenlq.net/cpp11-faq-chs 11以后可以直接在类里面初始化成员变量,类似这样 class A { int a=1; const in ...
- ActiveMQ的静态网络链接
-------------------------------------------------------------------- (1)ActiveMQ的networkConnector是什么 ...
- hzwer模拟赛 Hzwer的陨石
题目描述 Description 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很 ...
- Computer Vision: OpenCV, Feature Tracking, and Beyond--From <<Make Things See>> by Greg
In the 1960s, the legendary Stanford artificial intelligence pioneer, John McCarthy, famously gave a ...
- 个性化设置phpMyAdmin,去掉“以树形显示数据库”,禁用“发送错误报告”
个性化设置phpMyAdmin 在使用phpMyAdmin 3.5.8.2时,发现: 如果数据库有相同的前缀,左边数据库导航会把前缀合并,即所谓的“以树形显示数据库”,真的有点不习惯,如下图所示: 不 ...
- phpMyAdmin提示:配置文件权限错误,无法写入!解决方法
访问phpMyAdmin提示: 配置文件权限错误,无法写入! 解决办法: chmod -R 755 ./phpmyadmin 这样设置下phpMyAdmin目录权限属性为就可以访问了.原来phpMyA ...
- ubuntu ping响应慢的解决方法
ubuntu ping网站时每次ping指令都需要很久才能有响应,不过网络延迟却正常. 后来发现是因为/etc/nsswitch.conf文件中hosts的配置有问题,做如下修改后正常: 将原 ...
- Linux下c开发 之 线程通信(转)
Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...
- embed标签loop=true背景音乐无法循环
在html网页中加入背景音乐并设置为循环播放.一开始用<embed>标签,设置loop="true", 但是结果发现在IE浏览器可以,但是在chrome浏览器却无法实现 ...