之前项目中有个文件上传了需求,于是直接就使用了FormData对象异步上传,但是在测试得时候发现ie9无法正常上传(项目要求兼容IE9+),无奈,查资料得知IE9- 版本不支持formdata对象得异步上传!

怎么办呢?那就用表单提交吧。之前异步上传得接口后台返回的是JSON串,表单提交的话IE会提示将后台返回的json数据保存到本地,影响体验,无奈又让后台写了一个接口返回页面。

所以下面针对ie9又用了不同的接口,如果使用同一个接口返回的格式不能为json,最好为xml/html  。

为了页面不刷新,参考了公用得做法,直接将formtarget给了隐藏的iframe,这样表单提交后iframe就能处理提交后返回的数据,保持原始页面不被刷新,然后检测iframe是否加载完成,如果iframe接收到后台的数据加载完成得话,则证明form表单提交成功,代表文件上传成功。然后刷新当前页面展示已经上传得文件信息。

下面是主要代码:

//这里是html部分
<form id="fileUploadF" method="post" target="formUpFile" class="form form-group text-right" enctype="multipart/form-data">
<input type="file" id="fileUpIpt" class="fileUpIpt form-inline" accept="*/*" name="files" multiple="multiple" >
<input type="hidden" name="qblcId" value="${qblcId}">
<button id="btn_uploadfile" class="btn btn-sm btn-default upload-btn">
上传附件
</button>
</form>
<iframe id="formUpFile" border="none" width="0" height="0" name="formUpFile"></iframe>

js部分

//绑定click事件,监听提交按钮
$("#btn_uploadfile").click(function(){
$("#fileUpIpt").trigger("click");//触发input[type=file]上传
return false;
}); // 监听iframe是否加载完成
$('formUpFile').load (function(){
location.reload();//加载完成执行刷新
}) //监听是否上传新的文件
$("#fileUpIpt").change(function(){
if($(this).val() != ""){
try{//尝试直接使用异步上传
var formData = new
FormData(document.getElementById("fileUploadF"));
ajaxFileUpload(formData);
return false;
}catch(err){ //如果不支持异步上传则使用表单提交
//给form添加action地址并执行提交
$("#fileUploadF")
.attr("action","/TY/uploadFileforie9").submit(); }
} })

以下就是ajax 文件上传的函数部分,不做过多解释,这里添加了上传进度条

//ajax文件上传主函数
function ajaxFileUpload(datas){
var index;
$.ajax({
type:"post",
url:"${appPath }/TY/uploadFile",
async:true,
data:datas,
contentType: false,
processData: false,
xhr:function(){
var xhrObj = $.ajaxSettings.xhr();
if(onprogress && xhrObj.upload) {
 xhrObj.upload.addEventListener("progress" , onprogress, false);
       return xhrObj;
     }
},
success:function(res){
if(res.checkResult == "1"){
var fileList = res.result.files,addStr = "";
$.each(fileList, function(i,item) {
var fileNames = '<td><span class="glyphicon glyphicon-file" aria-hidden="true"></span>&nbsp; '+item.doc_name+'</td>'
addStr += '<tr><td>'+(i+1)+'</td>'+fileNames+'<td><span onclick="delectFile(\''+item.doc_id+
'\')" class="glyphicon glyphicon-trash del_ico" aria-hidden="true"></span></td>'+
'<td><span onclick="downloadFileById(\''+item.doc_id+'\',\''+item.doc_name+
'\')" class="glyphicon glyphicon-save download_ico" aria-hidden="true"></span></td></tr>'
});
$(".flieUpList tbody").html(addStr);
}else{
layer.alert(res.errorInfo);
}
}
});
} // 附件上传情况 ,这个方法大概0.05-0.1秒执行一次
function onprogress(evt){
$(".progress_wrap").show();
var loaded = evt.loaded; //已经上传大小情况
var tot = evt.total; //附件总大小
var per = Math.floor(100*loaded/tot); //已经上传的百分比 if(per==100){
layer.msg("上传成功! 正在处理请稍后...",function(){
$(".progress_wrap").hide();
});
}
   $("#porcessBar").html( per +"%" );
$("#porcessBar").css("width" , per +"%");
}

js 无刷新文件上传 (兼容IE9 )的更多相关文章

  1. 【JS】ajax 实现无刷新文件上传

    一.摘要 最近在做个东西,需要实现页面无刷新文件上传,目前看到的方法有两种 1) 通过隐藏iframe 实现页面无刷新,适用于不关心上传结果 <form target="hiddenF ...

  2. ie8实现无刷新文件上传

    ie8由于无法使用FormData,想要无刷新上传文件就显得比较麻烦.这里推荐使用jQuery-File-Upload插件,它能够很方便的解决ie8无刷新文件上传问题.(最低兼容到ie6) jQuer ...

  3. Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)(转)

    Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现) 相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦 ...

  4. 使用PHP和HTML5 FormData实现无刷新文件上传教程

    无刷新文件上传是一个常见而又有点复杂的问题,常见的解决方案是构造 iframe 方式实现. 在 HTML5 中提供了一个 FormData 对象 API,通过 FormData 可以方便地构造一个表单 ...

  5. Asp.Net 无刷新文件上传并显示进度条的实现方法及思路

    相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦苦来 实现呢?我并不否认”拿来主义“,只是我个人更喜欢凡是求个所以 ...

  6. SpringMVC ajax技术无刷新文件上传下载删除示例

    参考 Spring MVC中上传文件实例 SpringMVC结合ajaxfileupload.js实现ajax无刷新文件上传 Spring MVC 文件上传下载 (FileOperateUtil.ja ...

  7. 实用ExtJS教程100例-009:ExtJS Form无刷新文件上传

    文件上传在Web程序开发中必不可少,ExtJS Form中有一个filefield字段,用来选择文件并上传.今天我们来演示一下如何通过filefield实现ExtJS Form无刷新的文件上传. 首先 ...

  8. Javascrpt无刷新文件上传

    最近工作中遇到上传文件问题,主要需求是一步点击上传,兼容ie8+,当时用的dojox/form/uploader控件,这两天扒了一下源码,明白了原理拿出来分享一下. 总体思路如下: 1.对于支持XML ...

  9. php利用iframe实现无刷新文件上传功能

    上传原理很简单就是利用表单的打开方式为iframe的name名,这样就可以在当前页面的iframe打来了,实现文件上传,再利用js返回上传结果. form target .在 action 属性中规定 ...

随机推荐

  1. springboot2.x基础教程:动手制作一个starter包

    上一篇博客介绍了springboot自动装配的原理.springboot本身有丰富的spring-boot-starter-xx集成组件,这一篇趁热打铁加深理解,我们利用springboot自动装配的 ...

  2. get、post请求方式在jmeter中使用步骤

    jmeter:性能测试工具,压测 一.jmeter工具测试接口时使用步骤: 1.测试计划右键--添加--Threads(Users)--线程组(线程数就是并发数) 2.线程组右键--Sampler-- ...

  3. Windows docker镜像文件无法删除

    最近刚开始玩docker,下载镜像之前没有修改docker的保存路径,因此默认存在了c:\programdata下面,导致C盘空间不足. 之后修改了保存路径之后( docker engin里加&quo ...

  4. 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第四周:深层神经网络(Deep Neural Networks)-课程笔记

    第四周:深层神经网络(Deep Neural Networks) 4.1 深层神经网络(Deep L-layer neural network) 有一些函数,只有非常深的神经网络能学会,而更浅的模型则 ...

  5. [LeetCode]67. 二进制求和(字符串)(数学)

    题目 给你两个二进制字符串,返回它们的和(用二进制表示). 输入为 非空 字符串且只包含数字 1 和 0. 题解 两个字符串从低位开始加,前面位不够补0.维护进位,最后加上最后一个进位,最后反转结果字 ...

  6. Linux实战(5):Centos8安装python

    Centos8正式版已经发布了,已经尝鲜的小伙伴们会发现与其他Linux发行版不同,CentOS 8默认不安装Python.接下来的操作指导大家如何安装python3. 转自链接 安装python3 ...

  7. 【读书】Into The Air:进入空气稀薄地带

    珠穆朗玛峰,世界第一高峰,北部在中国境内,南部在尼泊尔境内.喜欢户外运动的人,曾经在20多岁的时候曾经"大言不惭"说这一辈子一定要去一次珠峰.<Into the Air> ...

  8. Laravel驱动管理类Manager的分析和使用

    Laravel驱动管理类Manager的分析和使用 第一部分 概念说明 第二部分 Illuminate\Support\Manager源码 第三部分 Manager类的使用 第一部分:概念解释 结合实 ...

  9. day58:Linux:BashShell&linux文件管理&linux文件下载上传

    目录 1.BashShell 2.Linux文件管理 3.Linux文件下载和上传 BashShell 1.什么是BeshShell? 命令的解释,用来翻译用户输入的指令 2.BashShell能做什 ...

  10. java 判断jsonObject 对象为null的天坑问题

    jsonObject = {"mmbRetrieveBookingResponse":{"bookingData":null,"isAfterTran ...