基于Jquery插件实现跨域异步上传文件功能


Posted in Javascript onApril 26, 2016

先说明白

这个跨域异步上传功能我们借助了Jquery.form插件,它在异步表单方面很有成效,而跨域我们会在HTTP响应头上添加access-control-allow-method,当然这个头标记只有IE10,火狐和谷歌上支持,对于IE10以下的浏览器来说,我们就不能用这种方式了,我们需要换个思路去干这事,让服务端去重写向我们的客户端,由客户端(与文件上传页面在同域下)来返回相关数据即可。

再做事

1 Jquery.form的使用

<form method="post" action="http://127.0.0.1:801/Home/UploadResult" enctype="multipart/form-data" id="form1">
 <input name="qdctvfile" id="qdctvfile11" type="file" onchange="eventStart()">
</form>
<script type="text/javascript">
 $("#form1").ajaxForm({
  beforeSerialize: function () {
   var filepath = $("#qdctvfile11").val()
   var extStart = filepath.lastIndexOf(".");
   var ext = filepath.substring(extStart, filepath.length).toUpperCase();
   if (ext != ".PNG" && ext != ".JPG") {
    alert("图片仅支持png,jpg格式");
    $("#qdctvfile11").val("");
    return false;
   }
  },
  success: function (data) {
   alert(data);
  }
 });
 function eventStart(obj) {
  $("#form1").submit();
 }

注意,代码中的eventStart方法是指在选择文件后,自动提交表单,而ajaxForm表示提交表单为异常方式,success回调方法是指异步返回表单地址的返回值。

2 跨域的初步实现

解决域访问,我们可以在服务端的响应头上添加Access-Control-Allow-Origin和Access-Control-Allow-Methods两个特性即可,这些特性在IE10以下的浏览器不被支持,很是郁闷。

/// <summary>
 /// MVC模式下跨域访问
 /// </summary>
 public class MvcCorsAttribute : ActionFilterAttribute
 {
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
   Dictionary<string, string> headers = new Dictionary<string, string>();

   headers.Add("Access-Control-Allow-Origin", "*");
   headers.Add("Access-Control-Allow-Methods", "*");
   foreach (var item in headers.Keys)
   {
    filterContext.RequestContext.HttpContext.Response.Headers.Add(item, headers[item]);
   }

   base.OnActionExecuting(filterContext);
  }
 }

注意,在生产环境下,我们的Access-Control-Allow-Origin应该是指定合法的域名的,*表示对所以网站都开放访问,这是危险的。

3 解决IE10以下不能跨域的问题

对于IE浏览器确实没法说了,虽然很喜欢微软的东西,但对于IE来说,我只能是NO,我真不想过多的去谈论它,先看看IE实现跨域上传的解决思想:由客户端不直接返回数据,而是重写向到客户端的callback地址,由callback像ajaxForm方法返回最终的数据,这样就解决了直接的跨域问题了。

/// <summary>
  /// 第三方的服务端
  /// </summary>
  /// <param name="name"></param>
  /// <returns></returns>
  [HttpPost]
  public ActionResult UploadResult()
  {
   string data = "{'code':'OK','thumpImgUrl':'http://127.0.0.1/images/1.jpg'}";
   return Redirect("http://localhost:9497/Home/UploadCallback?data=" + data);
  }

  /// <summary>
  /// 可能是服务端来调用它
  /// </summary>
  /// <returns></returns>
  public ActionResult UploadCallback(string data)
  {
   return Content(data);
  }

有些时候,我们在想一个问题的解决方法时,如果一条路走不通过,可以换换思路,也许会有意外的收获!

有人问,这块使用POST方式在服务端与客户端进行数据传递可以不可以,大叔说:不可以,因为POST在提交到客户端后,客户端处理,然后还是把结果返回给服务端,最后服务端再把结果返回给ajaxform,这还是又回到了开始的跨域问题,哈哈!

基于Jquery插件实现跨域异步上传文件功能

基于Jquery插件实现跨域异步上传文件功能

呵呵,怎么样,挺有意思的吧!

更多精彩内容,请点击《jQuery上传操作汇总》,进行深入学习和研究。

以上就是本文的全部内容,希望对大家的学习有所帮助,感谢各位的阅读!

Javascript 相关文章推荐
神奇的7个jQuery 3D插件整理
Jan 06 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
Apr 26 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
Feb 21 Javascript
JavaScript原生对象之Number对象的属性和方法详解
Mar 13 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
Jun 19 Javascript
JS验证邮件地址格式方法小结
Dec 01 Javascript
JavaScript、jQuery与Ajax的关系
Jan 24 Javascript
jqPlot jQuery绘图插件的使用
Jun 18 Javascript
vue拦截器Vue.http.interceptors.push使用详解
Apr 22 Javascript
vue实现仿淘宝结账页面实例代码
Nov 08 Javascript
js中let能否完全替代IIFE
Jun 15 Javascript
小程序如何定位所在城市及发起周边搜索
Feb 11 Javascript
Bootstrap每天必学之模态框(Modal)插件
Apr 26 #Javascript
深入理解JS中的substr和substring
Apr 26 #Javascript
js获取页面及个元素高度、宽度的代码
Apr 26 #Javascript
jQuery javascript获得网页的高度与宽度的实现代码
Apr 26 #Javascript
JQuery给select添加/删除节点的实现代码
Apr 26 #Javascript
js计算时间差代码【包括计算,天,时,分,秒】
Apr 26 #Javascript
js 求时间差的实现代码
Apr 26 #Javascript
You might like
在项目中寻找代码的坏命名
2012/07/14 PHP
基于php split()函数的用法详解
2013/06/05 PHP
php动态生成函数示例
2014/03/21 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
学习面向对象之面向对象的术语
2010/11/30 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
node.js中的buffer.toJSON方法使用说明
2014/12/14 Javascript
JS动态计算移动端rem的解决方案
2016/10/14 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
微信小程序自定义键盘 内部虚拟支付
2018/12/20 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
了解JavaScript中let语句
2019/05/30 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
python数据结构之二叉树的统计与转换实例
2014/04/29 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
pip命令无法使用的解决方法
2018/06/12 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
Python将列表中的元素转化为数字并排序的示例
2019/12/25 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
MaBelle玛贝尔香港官网:香港钻饰连锁店
2019/09/09 全球购物
公司JAVA开发面试题
2015/04/02 面试题
"火柴棍式"程序员面试题
2014/03/16 面试题
生日寿宴答谢词
2014/01/19 职场文书
竞选村长演讲稿
2014/04/28 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
走进科学观后感
2015/06/18 职场文书