方法一:使用FormData(因IE8不支持FormData, IE10才支持,因此此方法不兼容IE10以下的IE浏览器) 
也可参考文章 http://www.jianshu.com/p/46e6e03a0d53

html:

<input type="file" class="form-control" id="inputfile" title="多个文件请打包后再上传" style="display:inline-block;width:100%;_overflow:hidden;" />

js:

//新增行的保存及上传文件
function uploadFile(data) {
var fileObj = document.getElementById("inputfile").files; // js 获取文件对象 var FileController = "/action/add"; // 接收上传文件的后台地址
var form = new FormData(); //20160301 添加其他参数
form.append("param1",param1);
form.append("param2",param2); if (fileObj.length != 0) {
var i = fileObj.length;
for (var j = 0; j < i; j++) {
form.append("file" + j, fileObj[j]); // 文件对象
}
}
form.append("data", data); // XMLHttpRequest 对象
xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.onreadystatechange = callback;
xmlHttpRequest.open("post", FileController, true);
/* event listeners */
// 进度条
// xmlHttpRequest.upload.addEventListener("progress", progressFunction, false);
// xmlHttpRequest.addEventListener("load", uploadComplete, false);
// xmlHttpRequest.addEventListener("error", uploadFailed, false);
// xmlHttpRequest.addEventListener("abort", uploadCanceled, false);
/* end listeners */
xmlHttpRequest.send(form);
} function callback() {
// 接收响应数据
// 判断对象状态是否交互完成,如果为4则交互完成
if (xmlHttpRequest.readyState == 4) {
// 判断对象状态是否交互成功,如果成功则为200
if (xmlHttpRequest.status == 200) {
// 接收数据,得到服务器输出的纯文本数据
var response = xmlHttpRequest.responseText;
//console.log(response); if(response == 1) {
enabledButton();
alert("保存成功!");
} else {
alert("保存失败,请重新尝试!"); }
enableButton(); }else{//!=200 alert("保存失败!");
enableButton();
}
}
}

方法二:使用form提交 兼容各种浏览器,form提交后会刷新页面,且不太好获取返回参数。如要返回原始页面,需要用response.sendRedirect(原始页面url)进行转向。 
html:

<form id="uploadFileForm" name="uploadFileForm" enctype="multipart/form-data" method="post">
<input type="hidden" id="param1" name="param1" value="123"/>
<input type="hidden" id="param2" name="param2" value="测试参数"/>
<div id="uploadFileTableDiv" style="margin-left:10%;">
<table border="1" width="80%">
<tr>
<td style="padding:10px;">
<span style="float:left;">上传文件:&nbsp;&nbsp;</span>
</td>
<td style="padding:10px;">
<input type="file" id="attach" name="attach" size="25" style="height:30px;" />
</td>
</tr>
<tr>
<td colspan="2" style="padding:10px;padding-left:50px;">
<button id="submit_btn" type="button" class="btn btn-default" onclick="javascript:submitFile();">
上传文件
</button>
</td>
</tr>
</table>
</div>
</form>

js:

//20160612 文件上传按钮 form表单提交
function submitFile(){
var attach = document.getElementById("attach").value;
alert("attach: " + attach); if(attach == undefined || attach == ""){
alert("请选择文件");
return;
} uploadFileForm.action = "/tools/uploadFileAction";
uploadFileForm.submit(); }

方法三:使用jquery.form.js支持的ajaxsubmit进行文件上传 
htm

<script th:src="@{/jquery/3.46.0/jquery.form.js}"></script>
<form id="uploadFileForm2" name="uploadFileForm2" enctype="multipart/form-data" method="post">
<div id="uploadFileTableDiv2" style="margin-left:10%;">
<table border="1" width="80%">
<tr>
<td style="padding:10px;">
<span style="float:left;">上传文件:&nbsp;&nbsp;</span>
</td>
<td style="padding:10px;">
<input type="file" id="attach2" name="attach2" size="25" style="height:30px;" />
</td>
</tr>
<tr>
<td colspan="2" style="padding:10px;padding-left:50px;">
<button id="submit_btn2" type="button" class="btn btn-default" onclick="javascript:ajaxSubmitFile();">
上传文件
</button>
</td>
</tr>
</table>
</div>
</form>

js:

//在表单上追加input hidden元素 存放其他参数
function appendInputElementForForm(formId,inputName,inputValue){
var myh = document.createElement("input");
myh.type = "hidden";
myh.value = inputValue;
myh.id = inputName;
myh.name = inputName;
document.getElementById(formId).appendChild(myh);
alert(document.getElementById(inputName).value);
} //20170207 文件上传ajax Form表单提交
function ajaxSubmitFile(){
var attach = document.getElementById("attach2").value;
alert("ajaxSubmitFile attach2: " + attach); if(attach == undefined || attach == ""){
alert("请选择文件");
return;
} appendInputElementForForm( "uploadFileForm2", "param1", "123");
appendInputElementForForm( "uploadFileForm2", "param2", "测试参数"); $('#uploadFileForm2').ajaxSubmit({
type:"post",
url:"/tools/ajaxUploadFileAction",
data:$('#uploadFileForm2').serialize(),
dataType:"json",
error:function(data){
alert(data);
},
success:function(data){
alert("ajaxSubmit上传成功");
alert("下载地址: " + data.data.attachment);
} });
}

最后附带上后台的java代码:

//20160612 文件上传
@RequestMapping(value = "ajaxUploadFileAction")
public ModelAndView ajaxUploadFile(HttpServletRequest request, HttpServletResponse response) throws Exception{
ResponseInfo responseInfo = new ResponseInfo();
logger.info("ajaxUploadFile param1: " + request.getParameter("param1"));
logger.info("ajaxUploadFile param2: " + request.getParameter("param2")); try {
//将当前上下文初始化给CommonsMutipartResolver (多部分解析器)
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver( request.getSession().getServletContext()); // 判断是否是多数据段提交格式
if (multipartResolver.isMultipart(request)) {
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request; logger.info("ajaxUploadFile param1: " + multiRequest.getParameter("param1"));
logger.info("ajaxUploadFile param2: " + multiRequest.getParameter("param2")); Iterator<String> iter = multiRequest.getFileNames();
logger.info("iter.hasNext(): "+iter.hasNext());
Integer fileCount = 0;
while (iter.hasNext()) {
MultipartFile multipartFile = multiRequest.getFile(iter.next());
String fileName = multipartFile.getOriginalFilename();
logger.info("upload demand filename: " + fileName );
//20170207 针对IE环境下filename是整个文件路径的情况而做以下处理
Integer index = fileName.lastIndexOf("\\");
String newStr = "";
if(index>-1){
newStr = fileName.substring(index+1); }else{
newStr = fileName;
}
if(!newStr.equals("")){
fileName = newStr;
}
logger.info("new filename: " + fileName ); if (multipartFile != null) {
HashMap<String,Object> result = DispatchInterfaceUtil.uploadFileByInputStream (multipartFile.getInputStream(),multipartFile.getSize(),fileName); Integer statusCode = (Integer)result.get("statusCode");
logger.info("statusCode: " + statusCode);
if( statusCode.equals(0) ){
String attachment = (String)result.get("attachment");
responseInfo. setStatus(true);
responseInfo.put("attachment", attachment);
}else{
String errorMessage = (String)result.get("errorMessage");
logger.error( "errorMessage: " + errorMessage); responseInfo.setStatus(false);
responseInfo.setMsg("文件上传失败");
}
}
fileCount++;
}//while
logger.info("fileCount: " + fileCount);
}
}catch (Exception e) {
// TODO: handle exception
responseInfo.setStatus(false);
responseInfo.setMsg("后台出现异常");
logger.warn("Error: ", e);
}
response.setContentType("text/html; charset=utf-8");
response.getWriter().write( JSON.toJSONString(responseInfo)); return null;
}

注意: 
(1)IE10可以支持application/json格式的Response了,也就是说低于IE10版本一下的IE浏览器都需要使用text/html格式的Response。 在Response头中指定Content-Type为text/html,是可以解决问题的。这样返回给客户端的是一个JSON字符串(并非JSON对象),无需IE来解析。 
(2)通过js动态添加的input file元素是无法通过form submit的方式(如上所述的后两种方法)将文件内容提交给后台进行文件上传的,因为后台服务器根本不知道有此元素. 若需要动态添加,可以先在html页面中添加上不可见的input file元素(这样后台服务器就知道了该元素的存在), 需要添加时再通过js语句 
document.getElementById(父元素ID).appendChild(inputFile元素对象) 
将input file对象添加在适当位置

(3)在$.each代码块内不能使用break和continue,要实现break和continue的功能的话,要使用其它的方式: 
break—-用return false; 
continue –用return true;

考虑浏览器兼容的文件上传(IE8不支持FormData)的更多相关文章

  1. 表单多文件上传样式美化 && 支持选中文件后删除相关项

    开发中会经常涉及到文件上传的需求,根据业务不同的需求,有不同的文件上传情况. 有简单的单文件上传,有多文件上传,因浏览器原生的文件上传样式及功能的支持度不算太高,很多时候我们会对样式进行美化,对功能进 ...

  2. Nginx集群之WCF大文件上传及下载(支持6G传输)

    目录 1       大概思路... 1 2       Nginx集群之WCF大文件上传及下载... 1 3       BasicHttpBinding相关配置解析... 2 4       编写 ...

  3. jquery.form 兼容IE89文件上传

    导入部分 <script type="text/javascript" src="js/jquery-1.8.3.min.js" charset=&quo ...

  4. JS_单个或多个文件上传_不支持单独修改

    A-From表单直接填写提交地址,不过干预: 1. 单文件上传 最简单的文件上传,是单文件上传,form标签中加入enctype="multipart/form-data",for ...

  5. html多文件上传,可支持预览

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. ajaxfileupload多文件上传 - 修复只支持单个文件上传的bug

    搜索: jquery ajaxFileUpload AjaxFileUpload同时上传多个文件 原生的AjaxFileUpload插件是不支持多文件上传的,通过修改AjaxFileUpload少量代 ...

  7. AngularJs 文件上传(实现Multipart/form-data 文件的上传)

    <!-- 上传yml文件 --> <div class="blackBoard" ng-show="vm.showUpop==true"> ...

  8. JS实现表单多文件上传样式美化支持选中文件后删除相关项

    http://www.youdaili.net/javascript/5903.html

  9. Servlet3.0学习总结——基于Servlet3.0的文件上传

    Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileu ...

随机推荐

  1. spring和junit整合

  2. 2018-南京网络赛icpc-L题(分层最短路)

    题意:给你n个点,m条边的有向带权图,然后你每次可以选<=k条边的边权变成0,问你1到n的最短路: 解题思路:这道题基本上就是原题了呀,bzoj2763(无向图),解法就是拆点跑分层的最短路,比 ...

  3. 百年老图难倒谷歌AI,兔还是鸭?这是个问题

    上面这张图,画的是鸭子还是兔子? 自从1892年首次出现在一本德国杂志上之后,这张图就一直持续引发争议.有些人只能看到一只兔子,有些人只能看到一只鸭子,有些人两个都能看出来. 心理学家用这张图证明了一 ...

  4. 提高网络灵活性和效率的组网方式—SD-WAN

    导读 最初,大多数企业只是简单地将软件覆盖添加到广域网连接上.但是,随着时间的推移,由于SD-WAN架构的易配置功能,企业将开始采用SD-WAN更复杂的功能. 广域网一般用于连接多个业务地点,如总部和 ...

  5. Django restframe 视图函数以及ModelSerializer的使用

    建立model数据库 from django.db import models __all__ = ['Book', 'Publisher', 'Author'] # Create your mode ...

  6. 基于docker部署使用ELK+FileBeat日志管理平台

    Docker从狭义上来讲就是一个进程,从广义上来讲是一个虚拟容器,专业叫法为 Application Container(应用容器).Docker进程和普通的进程没有任何区别,它就是一个普通的应用进程 ...

  7. Python多进程、多线程、协程

    转载:https://www.cnblogs.com/huangguifeng/p/7632799.html 首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是C ...

  8. HDU1251 字典树板子题

    题意:中文题,统计以某字符串作为前缀的字符串个数 刚学字典树,理解起来十分简单,就是维护一个多叉树,这里用的是链表版本,后面就用的是数组版本了,个人更喜欢数组版本,这里的链表版本就因为 莫名其妙的错误 ...

  9. 【XSY2733】Disembrangle DP

    题目描述 有一个\(3\times n\)的网格,一些格子里已经有棋子了,一些格子里还没有. 每次你可以选择往一个没有棋子的格子里放一个棋子,但要满足这个格子上下两个格子都有棋子或左右两个格子都有棋子 ...

  10. wstngfw IPsec 站点到站点连接示例

    wstngfw IPsec 站点到站点连接示例 在本例中,将假设以下设置: IPsec站点设置 站点 A 站点 B 名称 Beijing Office(北京办公室) 名称 Shenzheng Offi ...