ie9上传文件
兼容ie9文件上传,解决ie9下提示下载或保存
如果不考虑ie9兼容性,实现【上传图片】大致的思路如下:
- 由于公司是将所有上传的图片都放到【代理服务器】里。所以【上传图片】其实是上传到【代理服务器】。可以通过ajax,通过FormData将图片上传到【代理服务器】。
- 从【代理服务器】拿到的回调里,有压缩过的图片的url,将这个url赋值给DOM里图片img的src就行了。由于我们的项目是用的vue,直接绑定:src就行了。
- 上传图片到【代理服务器】完成后,需要将url等相关数据(我们的项目后端需要一个pid,来实现用户下次访问时,后端从代理服务器根据这个pid来获取相应图片】),通过ajax发给后端(我们公司的服务器)。
思路很简单,而且核心关键其实就是第1点,第2,3只是简单的DOM操作和ajax交换数据。接下来就只关注第1点的具体实现。
1. 通过formData,结合html5的input type=file来实现上传
<input name="file" type="file" @change="update" accept="image/x-png, image/jpg, image/jpeg">
对应的,Vue的methods里,update方法如下:
update(e) {
let file = e.target.files[0]; //input提供的API,如果需要过滤图片尺寸,也可以在e.target.files[0]里拿到相应数据。
let param = new FormData(); //通过FormData来将图片信息发送给服务器;FormData是html5的私有对象。
param.append('file', file, file.name);
/* 接下来,就是通过ajax,发送form数据到服务器,我们公司用的jQuery,比较普遍的应该是axios吧 */
$.ajax({
url: '/image/upload',
type: 'POST',
data: param, //保证data格式为FormData
processData: false, //必须false才会自动加上正确的Content-Type
contentType: false //必须false才会避开jQuery对 formdata 的默认处理
}).done(function(res) {
// 回调
})
}
然后,在回调里,给DOM里的图片src赋值就行了。
当然,如果不兼容ie9,现在这个方案就行了。
在ie9下,不支持FormData。所以在ie9下,只能通过form表单形式实现图片上传。
2. ie9下通过form表单实现文件上传
<form id="myForm" method="post" action="/image/ieupload" enctype="multipart/form-data">
<input name="file" type="file" @change="update" accept="image/x-png, image/jpg, image/jpeg">
<input id="submit" type="submit" style="display:none">
</form>
ie9不支持headers上传参数,可以采用参数拼接在接口上
form里,enctype必须为mulitpart/form-data,表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form- data,才能完整的传递文件数据。
同时要加上input type="submit",只有点击(或者trigger click)这个按钮,才会将数据发送到服务器。
这样,在上面的update方法里,就需要加一层判断,如果不是ie9(或者是浏览器不支持formData),就通过formData结合ajax实现上传图片。通过formData的好处是不用在DOM里写form,(form表单提交,一般的服务器处理方式是重定向),只通过ajax跟后端服务器交换数据可以让接口更加统一。而如果是ie9,则必须要通过form表单提交,在update方法里,通过trigger #submit元素的click事件来完成表单提交。
但是,如果服务器返回的是json,并不能拿到服务器返回的数据,而是直接提示下载或打开:

之所以ie9下提示打开或者保持,是因为:
ie无法解析回调里的json数据,就是说如果服务器返回json数据,ie会把它当做文件来处理,显示打开或保存。
解决方法如下:
在后端返回的时候自定义contype-type为"text/html"或者"text/plain",比如在node中这样写res.setHeader('Content-Type', 'text/html')。
这样改完之后,会发现,虽然现在不提示下载文件了,可是会直接跳转到新页面。

在ajax未诞生前,都是用iframe来实现无刷新的效果。为了避免跳转到新页面,需要手动指定跳转的页面为一个iframe。然后取到iframe里的回调内容后,将相应内容从iframe里取出来使用。
另外,由于因为file是Readonly,如果用户上传的图片不符合要求,想清空value,只能用新的file替换之前的file。
参考资料:http://www.cnblogs.com/nsky/archive/2012/12/28/2836578.html
链接:https://www.jianshu.com/p/b2ab1eb2452e
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
ie9上传文件的更多相关文章
- jQuery 关于IE9上传文件无法进入后台问题的原因及解决办法(ajaxfileupload.js第四弹)
第四弹的诞生完全不在自己最初的计划之中,是有个网友看了先前关于<ajaxfileupload.js系列>的文章后提出的问题,由于自己一直是用chrome浏览器去测试demo,完全忽略IE浏 ...
- 关于IE9中webdiriver使用autoit上传文件报错
在ie9中, type="file"的元素是通过js打开的 webdirver结合autoit上传文件时,会报拒绝访问的错 sciTE编辑器中是这样写的: #include < ...
- 三种上传文件不刷新页面的方法讨论:iframe/FormData/FileReader
发请求有两种方式,一种是用ajax,另一种是用form提交,默认的form提交如果不做处理的话,会使页面重定向.以一个简单的demo做说明: html如下所示,请求的路径action为"up ...
- Ajax方式上传文件
用到两个对象 第一个对象:FormData 第二个对象:XMLHttpRequest 目前新版的Firefox 与 Chrome 等支持HTML5的浏览器完美的支持这两个对象,但IE9尚未支持 For ...
- html+css上传文件控件美化
html上传美化: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- IE浏览器上传文件时本地路径变成”C:\fakepath\”的问题【转】
转自:http://www.iefans.net/ie-shangchuan-bendi-lujing-fakepath/ 在使用<input id="file_upl" t ...
- C# 结合html5 批量上传文件和图片预览
html5 新特性 <input id="imgsf" type="file" name="imgsf" multiple /> ...
- jQuery统计上传文件的大小
对于现代浏览器(支持html5)来说,在客户端统计上传文件的大小,可以通过$(selector)[0].files[0].size来实现.但在老版本的IE浏览器中,比如IE7,IE8或IE9,却不支持 ...
- js上传文件
一.原始的XMLHttpRequestjs上传文件过程(參考地址:http://blog.sina.com.cn/s/blog_5d64f7e3010127ns.html) 用到两个对象 第一个对象: ...
随机推荐
- cuts
1.cuts .replacename.fasta..replacename.fasta..replacename.fasta.cut.list awk 'system("mv Dme49. ...
- 网站JS控制的QQ悬浮
这是一个网站JS控制的QQ悬浮客服:代码1document.writeln("<div id=\"feedback\"><div id=\"f ...
- 内置函数-map
ret = map(abs,[-1,1,2,3]) print(ret) for i in ret: print(i) l = [1,-2,3,6,8,-7] l.sort(key=abs) prin ...
- 使用Fiddle对夜神模拟器进行抓包的设置
注意: 设置完后, 不开启 Fiddle 的话,模拟器就不能上网了. 可以通过再把网络配置 改回去 就可以恢复网络正常访问了 一.配置Fiddle参数设置 1.Tools->Options 2 ...
- javascript Hoisting变量提升
1. 看人家举的两个例子,我认为这里的判断是否定义: !var 其实就是 指是否在函数function里面定义了.只有在funciton里面定义了了,js才hoist到最上面去找这个变量的值,否则就按 ...
- 7B - 今年暑假不AC
“今年暑假不AC?” “是的.” “那你干什么呢?” “看世界杯呀,笨蛋!” “@#$%^&*%...” 确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了. ...
- dos命令 创建数据库,建表,两表联查,三表联查(mysql---第一篇)
首先打开mysql的控制台,输入密码进行登录 (ps:本文的mysql控制台,是运用的php的集成环境(phpstudy),点击运行,找到mysql命令行,直接打开就可以了) 登陆成功后,就可以进行 ...
- laraval migration 新增字段或者修改字段的方法
1.进入项目根目录执行artisan命令生成migration文件,可以指定--table和--path参数,会在对应目录下生成migration文件. php artisan make:migrat ...
- 201771010134杨其菊《面向对象程序设计java》第九周学习总结
第九周学习总结 第一部分:理论知识 异常.断言和调试.日志 1.捕获 ...
- dotNet程序员的Java爬坑之旅(三)之spring MVC篇一
使用maven構建springMVC項目,開發工具為IDEA 一.構建Maven項目,模板為WebApp 二.在pom文件中配置SpringMvc配置(springMvc需要以來servlet ,如本 ...