基于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 相关文章推荐
跨域请求之jQuery的ajax jsonp的使用解惑
Oct 09 Javascript
ajax处理php返回json数据的实例代码
Jan 24 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
Feb 10 Javascript
js操作模态窗口及父子窗口间相互传值示例
Jun 09 Javascript
jquery中toggle函数交替使用问题
Jun 22 Javascript
深入浅析Node.js 事件循环
Dec 20 Javascript
Backbone中View之间传值的学习心得
Aug 09 Javascript
微信小程序 for 循环详解
Oct 09 Javascript
vue 项目常用加载器及配置详解
Jan 22 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
Sep 07 jQuery
Vue初始化中的选项合并之initInternalComponent详解
Jun 11 Javascript
JavaScript代码实现简单计算器
Dec 27 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
初品cakephp 入门基础
2012/02/16 PHP
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
php经典算法集锦
2015/11/14 PHP
制作个性化的WordPress登陆界面的实例教程
2016/05/21 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
JS去掉字符串中所有的逗号
2017/10/18 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
JQuery样式与属性设置方法分析
2019/12/07 jQuery
JS实现简单日历特效
2020/01/03 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
sqlalchemy对象转dict的示例
2014/04/22 Python
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
Python线性方程组求解运算示例
2018/01/17 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
工程师求职简历的自我评价分享
2013/10/10 职场文书
销售冠军获奖感言
2014/02/03 职场文书
煤矿班组长竞聘书
2014/03/31 职场文书
奥巴马开学演讲稿
2014/05/15 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS