基于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 相关文章推荐
js表数据排序 sort table data
Feb 18 Javascript
读jQuery之一(对象的组成)
Jun 11 Javascript
JS判断数组中是否有重复值得三种实用方法
Aug 16 Javascript
jQuery页面加载初始化常用的三种方法
Jun 04 Javascript
JavaScript验证电子邮箱的函数
Aug 22 Javascript
js实现的奥运倒计时时钟效果代码
Dec 09 Javascript
JavaScript中的继承之类继承
May 01 Javascript
jquery+css3问卷答题卡翻页动画效果示例
Oct 26 Javascript
JavaScript用200行代码制作打飞机小游戏实例
Jun 21 Javascript
浅谈Express异步进化史
Sep 09 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
Mar 13 Javascript
vue新建项目并配置标准路由过程解析
Dec 09 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中的数组处理函数实例总结
2016/01/09 PHP
php提交过来的数据生成为txt文件
2016/04/28 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
js简单实现交换Li的值
2014/05/22 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
详解JS中统计函数执行次数与执行时间
2018/09/04 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
2019/09/02 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
Python中asyncore的用法实例
2014/09/29 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
使用Tkinter制作信息提示框
2020/02/18 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
css3发光搜索表单分享
2014/04/11 HTML / CSS
个人自我鉴定写法
2013/11/30 职场文书
教师节商场活动方案
2014/02/13 职场文书
医药营销个人求职信
2014/04/12 职场文书
单位婚育证明范本
2014/11/21 职场文书
入党自荐书范文
2015/03/05 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书
golang 如何用反射reflect操作结构体
2021/04/28 Golang
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏