考虑浏览器兼容的文件上传(IE8不支持FormData)

方法一:使用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;

原文地址:https://www.cnblogs.com/zhaoyan001/p/9455811.html

时间: 2024-08-25 20:27:38

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

轻量级 web 文件上传组件,支持html5,支持上传进度显示(IE10+、标准浏览器),文件拖拽,降级支持IE6+

老早就注册了博客园帐号,昨天才发现,连博客都没开,Github也是一样,深觉惭愧,赶紧潜个水压压惊`(*∩_∩*)′ 言归正传.大概许多人都会用到文件上传的功能,上传的库貌似也不少,比如(jQuery File Uploader.FineUploader.Uploadify.Baidu Web Uploader 等等),功能都很强大,代码量一般也较大.当时心想,就这么个小功能,杀鸡焉用牛刀,用库的话还得熟悉它的用法,有的需要引入额外的库,纯Flash的不考虑,还是动手造个轮子得了,至少造过之后能

【Servlet】利用Servlet3.0标准与JSTL表达式实现文件上传系统,支持图片上传后显示

伴随着JDK1.6一起出现的Servlet3.0标准,使得JSP的文件上传系统不再艰难,此前在JSP的文件上传系统需要<[Jsp]使用jspsmartupload完成简单的文件上传系统>(点击打开链接)类似这样的插件才能完成的文件上传系统,还不支持中文,使得各位程序猿掏空心思才能解决这个问题.现在Servlet3.0对文件上传的方法进行封装,无须分块就可以实现.而且Servlet3.0还不用类似<[Servlet]最简单的Servlet JavaWeb程序>(点击打开链接)在web

struts2 实现文件上传下载 (下载支持中文文件名)代码

struts2 实现文件上传: Action 代码: package com.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import org.apache.struts2.ServletActionContext; import com.o

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

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>表单提交</title> 6 <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> 7 &

使用Servlet3.0提供的API实现文件上传

在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了. 一.使用Servlet3.0提供的API实现文件上传 1.1.编写上传页面 1 <%@ page language="java" pageEncoding="UTF-8"

异步文件上传组件 Uploader

Uploader是非常强大的异步文件上传组件,支持ajax.iframe.flash三套方案,实现浏览器的全兼容,调用非常简单,内置多套主题支持 和常用插件,比如验证.图片预览.进度条等,广泛应用于淘宝网,比如退款系统.爱逛街.二手.拍卖.我的淘宝.卖家中心.导购中心等. Uploader的特性 支持ajax.flash.iframe三种方案,兼容所有浏览器.(iframe不推荐使用) 多主题支持,可以自己定制主题 丰富的插件支持 支持多选批量上传 支持上传进度显示 支持取消上传 支持图片预览(

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

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了. 一.使用Servlet3.0提供的API实现文件上传 1.1.编写上传页面 <%@ page language="java&

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了. 一.使用Servlet3.0提供的API实现文件上传 1.1.编写上传页面 1 <%@ page language="jav

JavaWeb 文件上传下载

1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下载功能实现的. 文件上传下载实际上是两步操作,第一是文件上传,就是将本地文件上传到服务器端,实现文件多用户之间的共享,第二是文件下载,就是将服务器端的文件下载到本地磁盘. 1.2. 文件上传下载实现原理 首先,需要知道文件是如何实现上传及下载的.文件上传及下载实现原理如下: 文件上传实现流程如下: