基于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 相关文章推荐
showModalDialog 和 showModelessDialog
Jan 22 Javascript
JQuery自定义事件的应用 JQuery最佳实践
Aug 01 Javascript
javascript数组去重3种方法的性能测试与比较
Mar 26 Javascript
一个JS函数搞定网页标题(title)闪动效果
May 13 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
Jun 27 Javascript
jquery基础知识第一讲之认识jquery
Mar 17 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
Jul 28 Javascript
使用use注册Vue全局组件和全局指令的方法
Mar 08 Javascript
React中嵌套组件与被嵌套组件的通信过程
Jul 11 Javascript
jQuery.parseJSON()函数详解
Feb 28 jQuery
原生JS实现汇率转换功能代码实例
May 13 Javascript
vue 通过base64实现图片下载功能
Dec 19 Vue.js
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学习教程之第1天
2008/06/15 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
Extjs 几个方法的讨论
2010/01/28 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
2010/04/11 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
JS是按值传递还是按引用传递
2015/01/30 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
JavaScript模拟push
2016/03/06 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
详解AngularJS 过滤器的使用
2018/06/02 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
layui 表单标签的校验方法
2019/09/04 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
在Django的模型中添加自定义方法的示例
2015/07/21 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
numpy.random.seed()的使用实例解析
2018/02/03 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
LINUX下线程,GDI类的解释
2016/12/14 面试题
教师演讲稿开场白
2014/08/25 职场文书
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL
使用HBuilder制作一个简单的HTML5网页
2022/07/07 HTML / CSS