基于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 相关文章推荐
讨论javascript(一)工厂方式 js面象对象的定义方法
Dec 15 Javascript
javscript对象原型的一些看法
Sep 19 Javascript
将文本输入框内容加入表中的js代码
Aug 18 Javascript
JS实现让网页背景图片斜向移动的方法
Feb 25 Javascript
JavaScript定时器和优化的取消定时器方法
Jul 03 Javascript
jQuery Mobile操作HTML5的常用函数总结
May 17 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
Nov 01 Javascript
拖动时防止选中
Feb 03 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
Aug 27 Javascript
vue-router命名路由和编程式路由传参讲解
Jan 19 Javascript
微信小程序如何播放腾讯视频的实现
Sep 20 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
Dec 14 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
使用eAccelerator加密PHP程序
2008/10/03 PHP
PHP反向代理类代码
2014/08/15 PHP
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
js 日期转换成中文格式的函数
2009/07/07 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
JQuery魔力之$(&quot;tagName&quot;)与selector
2012/03/05 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
js代码编写无缝轮播图
2020/09/13 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
Django实现发送邮件功能
2019/07/18 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
python可视化实现KNN算法
2019/10/16 Python
设置jupyter中DataFrame的显示限制方式
2020/04/12 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
应用心理学个人的求职信
2013/12/08 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
毕业生自荐材料范文
2014/12/30 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书