第四弹的诞生完全不在自己最初的计划之中,是有个网友看了先前关于《ajaxfileupload.js系列》的文章后提出的问题,由于自己一直是用chrome浏览器去测试demo,完全忽略IE浏览器(其实是故意的,懒得想浏览器兼容的问题,哈哈~),所以当我使用IE9去运行demo的时候,确实发现了同样的问题,就是ajax异步提交表单无法进入后台。

下面是解决整个问题的过程,以我在《jQuery 自制上传头像插件-附带Demo实例(ajaxfileupload.js第三弹) 》中上传的demo为基准,这样会更加容易理解一些。

虽然整个问题的表面现象是ajax异步提交表单无法进入后台,但是当我在浏览器中跟代码走一遍的时候,发现的首个问题就是下面的提示。

出现这个问题的原因其实要归罪于

function getFilePath(obj) {
if (obj) {
if (window.navigator.userAgent.indexOf("MSIE") >= 1) {
obj.select();
return document.selection.createRange().text;
}
else if (window.navigator.userAgent.indexOf("Firefox") >= 1) {
if (obj.files) {
return obj.files.item(0).getAsDataURL();
}
return obj.value;
}
return obj.value;
}
}

这个函数,最初加这个函数的时候是为了可以兼容,不巧,却弄巧成拙了。

这个函数是从网上直接贴下来的,当时就是怕不同浏览器直接用$().val()得不到选择的文件名称。但是当使用IE浏览器时,实际上这段代码返回的document.selection.createRange().text这个是一个“”(空字符串),所以这块可以直接使用obj.value或者无需使用这个方法,直接通过$().val()得到文件名就行。

而令我诧异的是,在IE下使用$().val()居然能得到文件的完整路径!!!而不单单只是一个文件名,这样就不用先上传再预览了,可以直接预览图片了。

这个问题解决了,重新运行代码,出现

这个问题的原因是在jQuery-1.4.2插件之后,已经去掉了handleError的方法,而下载了demo的朋友会发现,demo中使用的是jQuery-2.0.3插件。那么是不是把jQuery插件换一下就行了?不行。因为之所以用jQuery-2.0.3是因为只有在jQuery-1.7版本之后才支持delegate方法,但是我们可以在ajaxfileupload.js插件中加入handleError方法。copy下面代码到ajaxfileupload.js就可以了

    handleError: function( s, xhr, status, e )         {
// If a local callback was specified, fire it
if ( s.error ) {
s.error.call( s.context || s, xhr, status, e );
} // Fire the global callback
if ( s.global ) {
(s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
}
}

这个问题解决了,再次重新运行代码,出现

到这里实际上就是这篇文章的重点了,打开浏览器跟了一下,就是在

jQuery(form).submit();

这里抛出了异常。

原因是这样的,IE出于安全性的考虑,上传文件时必须要点击<input type=’file’>控件本身才能上传成功。而因为<input type=’file’>长的实在太丑,很少能满足我们的审美,我们通常都是会隐藏它,然后用其他的button去触发它。而这么做在IE9下是不被允许的。

至于解决方法,如果大家坚持用更加漂亮的上传控件,那我觉得用一些css的技巧吧,把<input type=’file’>控件遮挡下什么的,这个还是要根据实际情况来定,说来比较恶心,就一个IE9,破坏了其他浏览器的和谐,真是叫人抓心挠肝。

对于之前的demo,如果把<input type=’file’>显示出来,那么相应的后台也要进行一下修改,主要还是获取文件名的部分

要将

System.Web.HttpContext.Current.Request.Files[0].FileName

改成

System.IO.Path.GetFileName(System.Web.HttpContext.Current.Request.Files[0].FileName))

因为此时的System.Web.HttpContext.Current.Request.Files[0].FileName是一个完整的文件路径,而不单单是一个文件名。

当然,如果我们不想把图片先save到本地的话,可以直接用图片路径去预览,但是要知道,这个只适合IE呀~~所以,大家自己斟酌。

关于这个<input type=’file’>控件在IE9下能必须要被实际点击才能上传的问题,我想一定有其他解决的办法,希望知道的朋友能够分享一下。

系列分享:

ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)

jQuery 关于ajaxfileupload.js插件的逐步解析(ajaxfileupload.js第二弹)

jQuery 自制上传头像插件-附带Demo实例(ajaxfileupload.js第三弹)

jQuery 关于IE9上传文件无法进入后台问题的原因及解决办法(ajaxfileupload.js第四弹)的更多相关文章

  1. 上传文件,经过Zuul,中文文件名乱码解决办法

    转载请标明出处: http://blog.csdn.net/forezp/article/details/77170470 本文出自方志朋的博客 问题描述 在项目中又一个上传文件的oss服务,直接调用 ...

  2. zblog上传安装主题插件不成功的原因和解决办法

    最近有不少zblog用户反映在后台上传安装主题或者插件的时候出现了问题.本文就来尝试说明下这类问题的原因和解决办法. 首先来说说zblog主题或者插件的安装方法,一共有三种方式: 第一种是直接在网站后 ...

  3. SpringBoot上传文件,经过spingCloud-Zuul,中文文件名乱码解决办法

    最近用springCloud整合springboot做分布式服务发现经过zuul之后上传的中文文件名乱码全都变成?????,从而引发异常,单独用springboot却是好的,在网上找到相关资料总结如下 ...

  4. 上传文件报413 Request Entity Too Large错误解决办法

    产生这种原因是因为服务器限制了上传大小 1.nginx服务器的解决办法 修改nginx.conf的值就可以解决了 将以下代码粘贴到nginx.conf内 client_max_body_size 20 ...

  5. jquery 实现ajax 上传文件的功能(使用插件 ajaxfileupload)

    js文件的下载地址 : http://files.cnblogs.com/wangqc/ajaxfileupload.js 页面代码: <html>    <!-- 引入相关的js文 ...

  6. 使用jquery插件uploadify上传文件的方法与疑问

    我是学生一枚,专业也不是计算机,但又要用到很多相关技术,所以在技术基础不牢靠的情况下,硬着头皮在做.最近在做一个小项目需要上传图片,而且是需要用ajax的方式.但是利用jquery的ajax方法总会有 ...

  7. HTML5 jQuery+FormData 异步上传文件,带进度条

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href ...

  8. IT轮子系列(四)——使用Jquery+formdata对象 上传 文件

    前言 在MVC 中文件的上传,一般都采用控件: <h2>IT轮子四——文件上传</h2> <div> <input type="file" ...

  9. Ajax JQuery HTML 提交上传文件File HTML+ Ajax+ASP.NET+ WebService

    起因:公司最近有些项目用到了HTML+WebService的组合,发现访问速度等都快了许多,但是由于通过Ajax只能应付一些简单的文字类的传输,上传文件就捉襟见肘了,如果一直引用第三方的swf之类上传 ...

随机推荐

  1. COOKIE的优化与购物车小试

    由于经常被抓取文章内容,在此附上博客文章网址:,偶尔会更新某些出错的数据或文字,建议到我博客地址 :  --> 点击这里 一 Cookie 的优化 1.1 一般而言,我们设置cookie是在ph ...

  2. net项目总结一(1)

    中小型新闻发布系统 代码结构:分为实体层,数据层与接口,数据工厂层,业务逻辑层,公共层,UI层(由于图片上传实在麻烦,所以只上传少量而已),项目中用到了工厂模式,解耦BLL层和DLL层 1.登录功能, ...

  3. Mybatis框架 使用接口Mapper实现数据库的crud操作

    Mybatis的Mapper接口方式实现简单crud操作: 1.创建实体类 与数据库对应 我的实体类是<Student>   package com.hxzy.mybatis.pojo; ...

  4. 关于Collections的操作方法

    Collections是一个包装类,其中包含有各种有关集合操作的静态多态方,比如可以作用在List和Set上,此类不能实例化. 排序 Integer[] array = new Integer[]{3 ...

  5. Vulnhub Breach1.0

    1.靶机信息 下载链接 https://download.vulnhub.com/breach/Breach-1.0.zip 靶机说明 Breach1.0是一个难度为初级到中级的BooT2Root/C ...

  6. (二)SSO之CAS框架单点退出,自定义退出界面.

    用CAS的退出,只能使用它自己的那个退出界面,如果有这样的要求, 要求退出后自动跳转到登录界面, 该如何做呢?下面这篇文章实现了退出后可以自定义跳转界面.  用了CAS,发现退出真是个麻烦事,退出后跳 ...

  7. GCD介绍:Dispatch_source

    [转自:GCD介绍(三): Dispatch Sources] 何为Dispatch Sources 简单来说,dispatch source是一个监视某些类型事件的对象.当这些事件发生时,它自动将一 ...

  8. python web开发学习笔记一:javascript基础

    一.认识js: 能进入到软件所实习是我的最大的收获,也是我的荣幸,我相信努力付出一定能够换回收获. 项目最先开始的是接触到web前端的一些内容,我们需要利用flask搭建应该有的框架.我有一些pyth ...

  9. 2016级算法第六次上机-C.AlvinZH的学霸养成记II

    1032 AlvinZH的学霸养成记II 思路 中等题,贪心. 所有课程按照DDL的大小来排序. 维护一个当前时间curTime,初始为0. 遍历课程,curTime加上此课程持续时间d,如果这时cu ...

  10. L06-Ubuntu系统中部署Vagrant和VirtualBox

    一.前言 1.Vagrant是一个搭建完整的虚拟开发环境的工具~~~更多关于Vagrant理论可查看这篇博文https://www.cnblogs.com/davenkin/p/vagrant-vir ...