jQuery 关于IE9上传文件无法进入后台问题的原因及解决办法(ajaxfileupload.js第四弹)
第四弹的诞生完全不在自己最初的计划之中,是有个网友看了先前关于《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第四弹)的更多相关文章
- 上传文件,经过Zuul,中文文件名乱码解决办法
转载请标明出处: http://blog.csdn.net/forezp/article/details/77170470 本文出自方志朋的博客 问题描述 在项目中又一个上传文件的oss服务,直接调用 ...
- zblog上传安装主题插件不成功的原因和解决办法
最近有不少zblog用户反映在后台上传安装主题或者插件的时候出现了问题.本文就来尝试说明下这类问题的原因和解决办法. 首先来说说zblog主题或者插件的安装方法,一共有三种方式: 第一种是直接在网站后 ...
- SpringBoot上传文件,经过spingCloud-Zuul,中文文件名乱码解决办法
最近用springCloud整合springboot做分布式服务发现经过zuul之后上传的中文文件名乱码全都变成?????,从而引发异常,单独用springboot却是好的,在网上找到相关资料总结如下 ...
- 上传文件报413 Request Entity Too Large错误解决办法
产生这种原因是因为服务器限制了上传大小 1.nginx服务器的解决办法 修改nginx.conf的值就可以解决了 将以下代码粘贴到nginx.conf内 client_max_body_size 20 ...
- jquery 实现ajax 上传文件的功能(使用插件 ajaxfileupload)
js文件的下载地址 : http://files.cnblogs.com/wangqc/ajaxfileupload.js 页面代码: <html> <!-- 引入相关的js文 ...
- 使用jquery插件uploadify上传文件的方法与疑问
我是学生一枚,专业也不是计算机,但又要用到很多相关技术,所以在技术基础不牢靠的情况下,硬着头皮在做.最近在做一个小项目需要上传图片,而且是需要用ajax的方式.但是利用jquery的ajax方法总会有 ...
- HTML5 jQuery+FormData 异步上传文件,带进度条
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href ...
- IT轮子系列(四)——使用Jquery+formdata对象 上传 文件
前言 在MVC 中文件的上传,一般都采用控件: <h2>IT轮子四——文件上传</h2> <div> <input type="file" ...
- Ajax JQuery HTML 提交上传文件File HTML+ Ajax+ASP.NET+ WebService
起因:公司最近有些项目用到了HTML+WebService的组合,发现访问速度等都快了许多,但是由于通过Ajax只能应付一些简单的文字类的传输,上传文件就捉襟见肘了,如果一直引用第三方的swf之类上传 ...
随机推荐
- PHP set_error_handler()函数的使用
我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置.行数和原因.有很多人说,这并没有什么大不了.确实,在调试程序阶段,这确实是没啥的,而且我认为给出错误路径是必 ...
- J - Judge(快速幂)(同余定理)
J - Judge Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Submit S ...
- “全栈2019”Java异常第一章:什么是异常?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- Java中Arrays工具类
以下是实现六种功能的方法: 1.比较两个数组值是否相等: 结果为true.false.(布尔型不能比较) int []a={10,20,30}; int []b={10,20,30}; int []c ...
- 为解决Samba windows 无法访问 尝试过的方法
1, 通过 vi /etc/sysconfig/selinux 把 SELINUX=enforcing 修改为SELINUX= disable 退出保存,并且重启.(设置了) 2, 把wind ...
- 【bug】记一个有趣的“bug”
产品经理在使用我们用户功能的是,需要查询一个用户,知道这个用户的id,我说支持模糊查询的. 他输入"余XX",点击查询,怎么都查不出这个用户. 我到用户表里确认,确实有这个ID的用 ...
- 根据域名获取ip地址gethostbyname
#include <sys/socket.h> #include <stdio.h> #include <netdb.h> int main(int argc, c ...
- Numpy:np.vstack()&np.hstack() flat/flatten
一 . np.vstack: 按垂直方向(行顺序)堆叠数组构成一个新的数组 In[3]: import numpy as np In[4]: a = np.array([[1,2,3]]) a.sh ...
- 【实战】Tomcat管理后台Getshell
一.制作war包 1.xiaoma.jsp压缩成xiaoma.zip格式,然后修改为xiaoma.war 2.修仙之百度大法 二.部署war包(选择文件,上传即可,不啰嗦啦) 三.C刀连接:http: ...
- linux安装oracle 报错[INS-20802] Oracle Net Configuration Assistant failed 解决办法
[INS-20802] Oracle Net Configuration Assistant failed 首先从LinuxIDC.com下载这个补丁包,然后用 unzip p8670579_1120 ...