基于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 UI 应用不同Theme的办法
Sep 12 Javascript
javascript向后台传送相同属性的参数即数组参数
Feb 17 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
Jan 13 Javascript
JavaScript错误处理
Feb 03 Javascript
详解JavaScript中setSeconds()方法的使用
Jun 11 Javascript
Jquery简单分页实现方法
Jul 24 Javascript
AngularJS入门教程之AngularJS表达式
Apr 18 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
详解如何构建一个Angular6的第三方npm包
Sep 07 Javascript
jQuery插件实现的日历功能示例【附源码下载】
Sep 07 jQuery
Puppet的一些技巧
Sep 17 Javascript
详解Node.JS模块 process
Aug 31 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
php 地区分类排序算法
2013/07/01 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
ThinkPHP的常用配置选项汇总
2016/03/24 PHP
php数据访问之查询关键字
2016/05/09 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
js AspxButton的客户端操作
2009/06/26 Javascript
页面版文本框智能提示JS代码
2009/11/20 Javascript
javascript 导出数据到Excel(处理table中的元素)
2009/12/18 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
javascript中的正则表达式使用详解
2015/08/30 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
Python实现栈的方法
2015/05/26 Python
Python3.2模拟实现webqq登录
2016/02/15 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
解析Python的缩进规则的使用
2019/01/16 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
python之yield和Generator深入解析
2019/09/18 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
python实现感知机模型的示例
2020/09/30 Python
Html5插件教程之添加浏览器放大镜效果的商品橱窗
2016/01/07 HTML / CSS
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
CLR与IL分别是什么含义
2016/08/23 面试题
2014年公司迎新年活动方案
2014/02/24 职场文书
创先争优一句话承诺
2014/05/29 职场文书
信息管理与信息系统专业求职信
2014/06/21 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
辩论赛主持人开场白
2015/05/29 职场文书