利用jquery.form实现异步上传文件
实现原理
目前需要在一个页面实现多个地方调用上传控件上传文件,并且必须是异步上传。思考半天,想到通过创建动态表单包裹上传文件域,利用jquery.form实现异步提交表单,从而达到异步上传的目的,在上传完毕后移除上传表单,避免与原有表单形成嵌套,导致原有的表单无法正常提交。同时该方式还支持一次上传一个文件,重复上传或者一次上传多个文件,具有较好的方便性。
代码实现
ayscUploadFile方法包含两个参数, wrapId和postMap。
wrapId被指定为要被上传表单包裹的位置id。
postMap是一个对象,主要包含以下信息:
1、表单提交地址Url
由于上传文件的表单都是enctype='multipart/form-data',不能使用post提交文本参数,需要使用get方式提交其他参数,因此要传递额外的参数在url中直接带上参数。
2、type参数
允许上传的文件类型
3、folder参数
指定上传文件的自定义存储子目录,默认不需要指定。
4、beforeCallback
beforeCallback为ajax提交表单之前事件触发函数
5、successCallback
successCallback为上传成功后的处理函数
6、errorCallback
errorCallback为ajax异步提交表单失败后的处理函数
函数功能
1、异步上传文件
2、支持批量上传文件
function ayscUploadFile(wrapId, postMap){/*判断被包裹的id是否存在*/if(wrapId == "undefined" || wrapId.length == 0){alert("被包裹的id不存在");return false;}else{ wrapId = wrapId.indexOf("#") >= 0 ? wrapId : "#"+ wrapId;}if(!(typeof(postMap) == "object")){alert("上传配置参数错误");return false;}var url = postMap["url"];/*判断url是否为空*/if(!(url != "undeifned" && url.length > 0)){alert("上传地址错误");return false;}else{/*上传文件类型*/var type = ("type" in postMap) ? postMap["type"] : "";/*自定义上传文件目录*/var folder = ("folder" in postMap) ? postMap["folder"] : "";/*url地址加上限制上传文件的类型*/if(type.length > 0){url = adArgsToUrl(url, "type", type);}/*url地址加上自定义的上传文件存储位置*/if(folder.length > 0){url = adArgsToUrl(url, "folder", folder);}} /*表单id*/var formId = "frm_"+ wrapId.replace("#", "");/*生成表单*/var formContent = "<form id='"+ formId +"' name='"+ formId +"' action='"+ url+"' method='post' enctype='multipart/form-data'></form>"; /*将表单包裹在指定的id上*/if($("form[id="+ formId +"]").length == 0){$(wrapId).wrap(formContent);}/*验证表单中文件域是否已经选择文件*/var checkForm = true;$("form[id="+ formId +"] > :file").each(function(){if(this.value.length == 0){alert("尚未选择文件,请选择文件");checkForm = false;return;}});if(checkForm){/*回调方法*/var beforeCallback = postMap["beforeCallback"]; var successCallback = postMap["successCallback"]; var errorCallback = postMap["errorCallback"]; /*异步上传文件*/$("#" + formId).ajaxSubmit({dataType:"html",beforeSend:function(httpRequest){if(typeof(beforeCallback) == "function"){if(!beforeCallback.call(null, formId)){httpRequest.abort();alert("终止执行ajax异步提交")}}else{alert("正在上传文件,请耐心等待,不要关闭浏览器");}},success:function(responseText){alert(responseText)/*重置表单,确保允许继续添加上传文件*/resetForm();if(typeof(successCallback) == "function"){/*解析返回结果*/ successCallback.call(null, parseResultMap(responseText));}else{alert("文件上传成功");}},error:function(responseText){resetForm();if(typeof(errorCallback) == "function"){/*解析返回结果*/errorCallback.call(null);}else{alert("网络通讯异常,上传失败,请重新上传或稍后再试");}}});}/*重置表单信息*/function resetForm(){/*重置上传表单内容,方便上传新的文件*/$("#"+ formId).clearForm();/*移除表单,恢复原样,避免表单嵌套*/$(wrapId).unwrap("#"+ formId); }/*解析返回结果*/function parseResultMap(responseText){var resultMap = {};var jsonObject = eval("("+ responseText +");");var fileName = ("fileName" in jsonObject) ? jsonObject["fileName"] : "";var fileSize = ("fileSize" in jsonObject) ? jsonObject["fileSize"] : "";var fileUrl = ("fileKey" in jsonObject) ? jsonObject["fileKey"] : "";var fileExt = ("fileExt" in jsonObject) ? jsonObject["fileExt"] : "";var message = ("message" in jsonObject) ? jsonObject["message"] : "上传失败";var uploadState = ("uploadState" in jsonObject) ? jsonObject["uploadState"] : "0"; fileSize = (parseInt(fileSize)/1024).toFixed(2);resultMap["fileName"] = fileName;resultMap["fileSize"] = fileSize;resultMap["fileUrl"] = fileUrl;resultMap["fileExt"] = fileExt;resultMap["message"] = message; resultMap["uploadState"] = uploadState; return resultMap;}
}
上述函数使用需要引入的外部脚本文件
<script type="text/javascript" src="js/jquery.js"></script><script type="text/javascript" src="js/jquery.form.js"></script>
另外特别说明:
beforeSend方法实际上实在$.ajax中,他接收一个XMLHTTPRequest参数,因此若要挂起ajax请求,执行XMLHTTPRequest的abort()即可。
parseResultMap方法为接收服务器返回的数据并进行处理。、
ajaxSubmit方法实现的异步提交实际上还是jquery的$.ajax的进一步封装,方便了大家的使用.
批量上传文件
该方法也支持一次上传多个文件。但必须创建多个文件域控件,到时上传表单包含这些文件域,实现批量上传文件。
<div id="divWrap"><input type="file" id="fileOne" name="fileOne" value="" /><input type="file" id="fileTwo" name="fileTwo" value="" /><input type="file" id="fileThree" name="fileThree"value="" /><input type="file" id="fileFour" name="fileFour" value="" />
</div>
需要批量上传的文件域必须被包裹在指定的包裹id里(divWrap),包裹id用于指定动态表单的创建位置。上面的html代码,就是一个包含多个文件域的实例,这样就可以一次上传多个文件。
另外一种 方式可以曲线实现批量上传。用户每上传完毕一个文件后,允许用户继续上传文件,回调函数把服务器返回的上传文件信息输出给页面,页面记录下用户所有的上传文件信息。
参考资料
http://api.jquery.com/Ajax_Events/
http://baike.baidu.com/link?url=zsF_hdb0eZGOtzG2-fwLiHSPJDw0NqZ9GqXScpmBoF3Y_UauuT3HlJrt6raotAsVbVg-_TZQ6zdkh-GYZ91Wn_
http://www.w3school.com.cn/xmldom/dom_http.asp
http://www.cnblogs.com/beniao/archive/2008/03/29/1128914.html
https://github.com/malsup/form
转载于:https://www.cnblogs.com/wala-wo/p/5119208.html
利用jquery.form实现异步上传文件相关推荐
- jquery form java_springmvc利用jquery.form插件异步上传文件示例
需要的下载文件: jQuery.form.js jquery.js commons-fileupload.jar commons-io.jar 示例图片 pom.xml commons-fileupl ...
- ajax异步上传什么意思,使用 jQuery 的 AJAX 异步上传文件
现在基本上很多网页里面都在使用 jQuery,要实现文件的异步上传,大多数的解决方法都是使用 jQuery 插件,如果你只是上传一张图片,使用插件反而觉得多余了,其实 jQuery 的 ajax() ...
- jquery form插件(ajax)上传文件实现及原理
原理: jquery form插件ajax上传文件的原理, 1.浏览器实现了XMLHttpRequest level2规范的,则插件使用xhr直接提交文件.通常来说chrome.firefox都实现了 ...
- jq ajax异步上传文件,jQuery插件ajaxFileUpload异步上传文件
AjaxFileUpload.js并不是一个很出名的插件,只是别人写好的放出来供大家用,原理都是创建隐藏的表单和iframe然后用JS去提交,获得返回值. 当初做了个异步上传的功能,选择它因为它的配置 ...
- jQuery异步上传文件
jQuery异步上传文件 我想通过jQuery异步上传文件,这是我的HTML: 1 2 3 <span>File</span> <input type="fil ...
- 如何使用 jQuery 异步上传文件?
问: 我想用 jQuery 异步上传文件. $(document).ready(function () { $("#uploadbutton").click(function () ...
- jq ajax异步上传图片插件,jQuery异步上传文件插件ajaxFileUpload详细介绍
一.ajaxFileUpload是一个异步上传文件的jQuery插件. 传一个不知道什么版本的上来,以后不用到处找了. 语法:$.ajaxFileUpload([options]) options参数 ...
- php js跨域上传文件,Jquery实现跨域异步上传文件步骤详解
这次给大家带来Jquery实现跨域异步上传文件步骤详解,Jquery实现跨域异步上传文件的注意事项有哪些,下面就是实战案例,一起来看一下. 先说明白 这个跨域异步上传功能我们借助了Jquery.for ...
- html中异步上传文件实现示例,HTML_html中异步上传文件实现示例,复制代码代码如下: form actio - phpStudy...
html中异步上传文件实现示例 复制代码代码如下: 复制代码代码如下: 这是html中最常见最简单的表单提交方式,但是这种方式必须会切换页面,也许有些时候我们希望可以在同一个页面与服务器进行交互,并不 ...
- 修改form重定到iframe中,模拟异步上传文件的效果
2019独角兽企业重金招聘Python工程师标准>>> <%@ page contentType="text/html; charset=GBK" lang ...
最新文章
- word文档内容如何防止被复制
- 更方便的函数回调——Lambda
- hello my first blog
- Java调用.NET webservice方法的几种方式
- 【转载更新】Linux工具之SED 2.应用实例
- maven项目包导不进去_IntelliJ Idea下Maven插件使用技巧
- Atitit 2017年的技术趋势与未来的大技术趋势
- sublime 格式化Json
- 使用EasyCHM破解版制作CHM帮助文档
- python随机生成电话号码
- Vite 入门 Vue Node
- 微博营销五种鱼饵秘制方法-鱼塘理论
- SEM: 科研图片处理
- 20181214-python-tips
- Python常见面试题汇总(根据面试总结)
- 12星座绝情榜,你的绝情指数是多少呢?
- 图像滤镜艺术---保留细节的磨皮滤镜之PS实现
- 数据结构(C语言)- 稀疏矩阵的快速乘法
- 谷粒商城--商品发布--笔记九
- 大自然保护协会2018全球影赛获奖作品合集
热门文章
- 手把手教你强化学习 (四)动态规划与策略迭代、值迭代
- mysql 查询关键词顺序
- [转]网上整理 Web JS 通用
- 函数 迭代器,生成器
- 使用OpenSSL转换X509 PEM与PFX证书
- Web1.0、Web2.0、Web3.0的主要区别
- iOS开发拓展篇—UIDynamic(捕捉行为)
- Codeforces Round #256 (Div. 2)——Multiplication Table
- 程序员求职之道(《程序员面试笔试宝典》)之民间的企业排名的可信度到底有多大?...
- Linux入门-vsftp