1:js判断type为file的input标签内是否有上传文件

    1. var fileInput = $('#file').get(0).files[0];
    2. if(!fileInput){
    3. layer.msg("未选择文件!",{
    4. time: 2000, //2s后自动关闭
    5. })
    6. }

    2:xhr上传文件方式

    var fd;
                        try {
                            fd = new FormData();
                        } catch (ex) {
                            alert(ex + "Please upgrade your browser");
                        }
    
                        fd.append("ssid",$("#serverid").val());
                        fd.append("accountId",$("#ID").val());
    
                        /* var classInfoElement = document.getElementById("classInfo");
                        var info = classInfoElement.value;
                        if(info == null || info == ""){
                            alert("请输入用于描述的重载信息!");
                            return;
                        }
                        fd.append("classDescribe",info); */
                        var list = document.getElementById("context").getElementsByTagName("input");
                        for (var i = 0; i < list.length && list[i]; i++) {
                            //判断是否为文本框
                            if (list[i].type === "file") {
                                fd.append("file", list[i].files[0]);
                                if (list[i].files[0].name.lastIndexOf(".txt") === -1) {
                                    alert("IIIegal file type:" + list[i].files[0].name);
                                    return;
                                }
                            }
                        }
                        try {
                            var xhr;
                            if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
                                xhr = new XMLHttpRequest();
                            } else {// code for IE6, IE5
                                try {
                                    xhr = ActiveXObject("MSXML2.XMLHTTP.3.0");
                                } catch (ex) {
                                    alert(ex);
                                }
                            }
                            if (xhr == null) {
                                alert("AJAX (XMLHTTP) not supported.");
                            }
                            if($("#num").val()<4){
                                document.getElementById("showprocessMe").style.display = "block";
                            }
                            //上传中设置上传的百分比
                            xhr.upload
                                    .addEventListener(
                                            "progress",
                                            function(evt) {
                                                if (evt.lengthComputable) {
                                                    var percentComplete = Math.round(evt.loaded
                                                            * 100 / evt.total);
                                                    document.getElementById("showprocessMe").innerHTML = 'plan:'
                                                            + percentComplete
                                                            + "%"
                                                            + "  byte:"
                                                            + evt.loaded
                                                            + "B/"
                                                            + evt.total
                                                            + "B";
                                                } else {
                                                    document.getElementById("showprocessMe").innerHTML = 'can not calculate ';
                                                }
                                            }, false);
                            //请求完成后执行的操作
                            xhr.addEventListener("load", function(evt) {
                                if($("#num").val()>=4){
                                    layer.msg("导入失败!账户角色栏位已满,请清理后重试",{
                                        time: 2000, //2s后自动关闭
                                    });
                                }else{
                                    layer.msg("导入成功!",{
                                        time: 2000, //2s后自动关闭
                                    });
                                }
                                /*window.location.href = "uploadingAndbind.do";*/
                            }, false);
                            //请求error
                            xhr.addEventListener("error", uploadFailed, false);
                            //请求中断
                            xhr.addEventListener("abort", uploadCanceled, false);
                            //发送请求
                            xhr.open("POST", "uploadRoleData.do");
                            //xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                            xhr.send(fd);
                        } catch (e) {
                            layer.msg('导入失败'+e.message,{
                                time: 2000, //2s后自动关闭
                            });
                        }
    

    3:struts的方式 获得输入流,唤醒浏览器下载文件

    <action name="downLoadData"
                    class="bomber.action.RoleManagerAction" method="downLoadData">
                <result name="txt" type="stream">
                    <param name="contentType">
                        application/text/plain
                    </param>
                    <param name="inputName">inputStream</param>
                    <param name="contentDisposition">
                        attachment;filename="${fileName}"
                    </param>
                    <param name="bufferSize">1024</param>
                </result>
            </action>
    

    配置文件详解:
    1、type 为 stream 应用 StreamResult 处理
    2、contentType
    内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片
    3、inputName
      下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法
    4、contentDisposition
      文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为:
      attachment;filename=”struts2.txt”,表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename=”struts2.txt”,那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline;filename=”struts2.txt”
    5、bufferSize
      下载缓冲区的大小