实现原理

目前需要在一个页面实现多个地方调用上传控件上传文件,并且必须是异步上传。思考半天,想到通过创建动态表单包裹上传文件域,利用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实现异步上传文件相关推荐

  1. jquery form java_springmvc利用jquery.form插件异步上传文件示例

    需要的下载文件: jQuery.form.js jquery.js commons-fileupload.jar commons-io.jar 示例图片 pom.xml commons-fileupl ...

  2. ajax异步上传什么意思,使用 jQuery 的 AJAX 异步上传文件

    现在基本上很多网页里面都在使用 jQuery,要实现文件的异步上传,大多数的解决方法都是使用 jQuery 插件,如果你只是上传一张图片,使用插件反而觉得多余了,其实 jQuery 的 ajax() ...

  3. jquery form插件(ajax)上传文件实现及原理

    原理: jquery form插件ajax上传文件的原理, 1.浏览器实现了XMLHttpRequest level2规范的,则插件使用xhr直接提交文件.通常来说chrome.firefox都实现了 ...

  4. jq ajax异步上传文件,jQuery插件ajaxFileUpload异步上传文件

    AjaxFileUpload.js并不是一个很出名的插件,只是别人写好的放出来供大家用,原理都是创建隐藏的表单和iframe然后用JS去提交,获得返回值. 当初做了个异步上传的功能,选择它因为它的配置 ...

  5. jQuery异步上传文件

    jQuery异步上传文件 我想通过jQuery异步上传文件,这是我的HTML: 1 2 3 <span>File</span> <input type="fil ...

  6. 如何使用 jQuery 异步上传文件?

    问: 我想用 jQuery 异步上传文件. $(document).ready(function () { $("#uploadbutton").click(function () ...

  7. jq ajax异步上传图片插件,jQuery异步上传文件插件ajaxFileUpload详细介绍

    一.ajaxFileUpload是一个异步上传文件的jQuery插件. 传一个不知道什么版本的上来,以后不用到处找了. 语法:$.ajaxFileUpload([options]) options参数 ...

  8. php js跨域上传文件,Jquery实现跨域异步上传文件步骤详解

    这次给大家带来Jquery实现跨域异步上传文件步骤详解,Jquery实现跨域异步上传文件的注意事项有哪些,下面就是实战案例,一起来看一下. 先说明白 这个跨域异步上传功能我们借助了Jquery.for ...

  9. html中异步上传文件实现示例,HTML_html中异步上传文件实现示例,复制代码代码如下: form actio - phpStudy...

    html中异步上传文件实现示例 复制代码代码如下: 复制代码代码如下: 这是html中最常见最简单的表单提交方式,但是这种方式必须会切换页面,也许有些时候我们希望可以在同一个页面与服务器进行交互,并不 ...

  10. 修改form重定到iframe中,模拟异步上传文件的效果

    2019独角兽企业重金招聘Python工程师标准>>> <%@ page contentType="text/html; charset=GBK" lang ...

最新文章

  1. word文档内容如何防止被复制
  2. 更方便的函数回调——Lambda
  3. hello my first blog
  4. Java调用.NET webservice方法的几种方式
  5. 【转载更新】Linux工具之SED 2.应用实例
  6. maven项目包导不进去_IntelliJ Idea下Maven插件使用技巧
  7. Atitit 2017年的技术趋势与未来的大技术趋势
  8. sublime 格式化Json
  9. 使用EasyCHM破解版制作CHM帮助文档
  10. python随机生成电话号码
  11. Vite 入门 Vue Node
  12. 微博营销五种鱼饵秘制方法-鱼塘理论
  13. SEM: 科研图片处理
  14. 20181214-python-tips
  15. Python常见面试题汇总(根据面试总结)
  16. 12星座绝情榜,你的绝情指数是多少呢?
  17. 图像滤镜艺术---保留细节的磨皮滤镜之PS实现
  18. 数据结构(C语言)- 稀疏矩阵的快速乘法
  19. 谷粒商城--商品发布--笔记九
  20. 大自然保护协会2018全球影赛获奖作品合集

热门文章

  1. 手把手教你强化学习 (四)动态规划与策略迭代、值迭代
  2. mysql 查询关键词顺序
  3. [转]网上整理 Web JS 通用
  4. 函数 迭代器,生成器
  5. 使用OpenSSL转换X509 PEM与PFX证书
  6. Web1.0、Web2.0、Web3.0的主要区别
  7. iOS开发拓展篇—UIDynamic(捕捉行为)
  8. Codeforces Round #256 (Div. 2)——Multiplication Table
  9. 程序员求职之道(《程序员面试笔试宝典》)之民间的企业排名的可信度到底有多大?...
  10. Linux入门-vsftp