调用html 5接口实现断点上传文件

来源:互联网 发布:域名备案之后怎么用 编辑:程序博客网 时间:2024/06/05 08:40

1 、java端使用servlet 接受请求

package com.fileupload;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.URLDecoder;import java.util.List;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONObject;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.commons.io.IOUtils;/** *  * @author gjl * 文件上传 * 具体步骤: * 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包 * 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同 * 3)对 DiskFileItemFactory 对象设置一些 属性 * 4)高水平的API文件上传处理  ServletFileUpload upload = new ServletFileUpload(factory); * 目的是调用 parseRequest(request)方法  获得 FileItem 集合list , *      * 5)在 FileItem 对象中 获取信息,   遍历, 判断 表单提交过来的信息 是否是 普通文本信息  另做处理 * 6) *    第一种. 用第三方 提供的  item.write( new File(path,filename) );  直接写到磁盘上 *    第二种. 手动处理   * */@MultipartConfigpublic class AjaxFilesUploadServlet extends HttpServlet{        /**     * 注释内容     */    private static final long serialVersionUID = 513258132164002370L;        /**     * @param req     * @param resp     * @throws ServletException     * @throws IOException     */    @Override    protected void doGet(HttpServletRequest request,            HttpServletResponse response) throws ServletException, IOException    {        String fileStr = new String(request.getParameter("filename")                .getBytes("ISO-8859-1"), "utf-8"); //中文乱码                String files[] = fileStr.split(","); //多个文件                //获取文件需要上传到的路径        String path = request.getRealPath("/upload") + File.separator;        JSONObject json = new JSONObject();        json.put("succ", true);        JSONObject jo = new JSONObject();        for (int i = 0; i < files.length; i++)        {            String[] file = files[i].split("\\!");            String id = file[0];            String fileRef = file[1];            String name = fileRef.substring(0, fileRef.lastIndexOf("."));            String type = fileRef.substring(fileRef.lastIndexOf(".") + 1);                        long size = getFileSize(path + name + "." + type);                        jo.put(id, size);            json.put("data", jo);        }        System.out.println("get返回json数据:" + json);                response.setContentType("text/plain");        response.getWriter().write(json.toString());            }        /** <一句话功能简述>     * 根据文件路径取得文件大小     * @param filePath 文件路径     * @return 返回文件大小     *      * @return long [返回类型说明]     * @exception throws [违例类型] [违例说明]     * @see [类、类#方法、类#成员]     */    private long getFileSize(String filePath)    {        long size = 0;        File file = new File(filePath);        if (file.exists())        {                        size = file.length();                    }                return size;    }        /**     * 上传流文件并保存     * @param request     * @param response     * @throws ServletException     * @throws IOException     */    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException    {                request.setCharacterEncoding("utf-8"); //设置编码        System.out.println("开始访问servlet(dopost) :");                JSONObject json = new JSONObject(); //返回的json串                String filename = ""; //文件名称        String path = request.getRealPath("/upload"); //获取文件需要上传到的路径                try        {            List<FileItem> items = new ServletFileUpload(                    new DiskFileItemFactory()).parseRequest(request);            for (FileItem item : items)            {                if (item.isFormField())                {                    // Process regular form field (input type="text|radio|checkbox|etc", select, etc).                    String fieldname = item.getFieldName();                    String fieldvalue = "";                    if (fieldname.equals("name"))                    {                        filename = fieldvalue = URLDecoder.decode(item.getString(),                                "UTF-8");                                            }                    else                    {                        fieldvalue = item.getString();                    }                                        System.out.println("fieldname:" + fieldname                            + "--fieldvalue:" + fieldvalue);                    // ... (do your job here)                }                else                {                    // Process form file field (input type="file").                    String fieldname = item.getFieldName();                    //String filename = FilenameUtils.getName(item.getName());                    InputStream filecontent = item.getInputStream();                    System.out.println("fieldname:" + fieldname + "--filename:"                            + filename + "---filecontent:" + filecontent                            + "---path:" + path);                    // item.write( new File(path,filename) );//第三方提供的;                    //手动写入硬盘                    if (makeDir(path))                    {                        createFile(path, filename);                    }                                        File file = new File(path + File.separator + filename);                    FileOutputStream fos = new FileOutputStream(file, true);                    InputStream is = item.getInputStream();                    IOUtils.copy(is, fos);                    is.close();                    fos.close();                                        System.out.println("获取上传文件的总共的容量:" + item.getSize());                }            }        }        catch (FileUploadException e)        {            e.printStackTrace();        }        /** 前端参数 **/        //String filenameaaa = request.getParameter("name");        //    String fileid = request.getParameter("fileid");        //    String file = request.getParameter("file");        //    String bytestart = request.getParameter("start");        ////获得磁盘文件条目工厂        //DiskFileItemFactory factory = new DiskFileItemFactory();        ////获取文件需要上传到的路径        //String path = request.getRealPath("/upload");        ////创建目录        //makeDir(path);        ////如果没以下两行设置的话,上传大的 文件 会占用 很多内存,        ////设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同        ///**        // * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上,         // * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的         // * 然后再将其真正写到 对应目录的硬盘上        // */        //factory.setRepository(new File(path));        ////设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室        //factory.setSizeThreshold(1024*1024) ;        //        ////高水平的API文件上传处理        //ServletFileUpload upload = new ServletFileUpload(factory);        //        //        //try {        ////可以上传多个文件        //List<FileItem> list = (List<FileItem>)upload.parseRequest(request);        //        //for(FileItem item : list)        //{        ////获取表单的属性名字        //String name = item.getFieldName();        //        ////如果获取的 表单信息是普通的 文本 信息        //if(item.isFormField())        //{        ////获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的        //String value = item.getString() ;        //        //request.setAttribute(name, value);        //}        ////对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些        //else        //{        ///**        // * 以下三步,主要获取 上传文件的名字        // */        ////获取路径名        //String value = item.getName() ;        ////索引到最后一个反斜杠        //int start = value.lastIndexOf("\\");        ////截取 上传文件的 字符串名字,加1是 去掉反斜杠,        //String filename = value.substring(start+1);        //        //request.setAttribute(name, filename);        //        ////真正写到磁盘上        ////它抛出的异常 用exception 捕捉        //item.write( new File(path,filename) );//第三方提供的        //System.out.println("获取上传文件的总共的容量:"+item.getSize());        //        //手动写的        //OutputStream out = new FileOutputStream(new File(path,filename));        //        //InputStream in = item.getInputStream() ;        //        //int length = 0 ;        //byte [] buf = new byte[1024] ;        //        //System.out.println("获取上传文件的总共的容量:"+item.getSize());        //        //// in.read(buf) 每次读到的数据存放在   buf 数组中        //while( (length = in.read(buf) ) != -1)        //{        ////在   buf 数组中 取出数据 写到 (输出流)磁盘上        //out.write(buf, 0, length);        //            //}        //        //in.close();        //out.close();        catch (Exception e)        {            e.printStackTrace();        }                json.put("succ", true);                System.out.println("post返回json数据:" + json);                response.setContentType("text/plain");        response.getWriter().write(json.toString());    }        /** 创建文件     * <功能详细描述>     * @param string     * @param string2 [参数说明]     * @return      *      * @return void [返回类型说明]     * @throws IOException      * @exception throws [违例类型] [违例说明]     * @see [类、类#方法、类#成员]     */    private static boolean createFile(String path, String fileName)            throws IOException    {        boolean creator = true;        File myPath = new File(path, fileName);        if (!myPath.exists())        {            creator = myPath.createNewFile();        }        return creator;            }        /**     * 创建目录     * <功能详细描述>     * @param path     * @return [参数说明]     *      * @return boolean [返回类型说明]     * @exception throws [违例类型] [违例说明]     * @see [类、类#方法、类#成员]     */    private boolean makeDir(String path)    {        boolean mk = true;        File myPath = new File(path);        if (!myPath.exists())        {                        mk = myPath.mkdirs();                    }        return mk;    }    }
2 前端使用现成的HTML 5 API 分段发送数据

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="description" content="Ajax文件上传断点续传"><meta name="description" content="Ajax文件上传断点续传"><meta name="keywords" content="web前端, css, jQuery, javascript"><meta name="author" content="gjl"><title>Ajax文件上传断点续传</title><link rel="stylesheet" href="res/demo.css" type="text/css"><link rel="stylesheet" href="res/btn.css" type="text/css"><link rel="stylesheet" href="res/hl.css" type="text/css"><style>ul { padding: 0; margin: 0; list-style-type: none; }.upload { width: 600px; margin: 0 auto; }.form { padding: 12px 0 30px; }.file { position: absolute; width: 230px; height: 34px; cursor: pointer; opacity: 0; }.file:hover + .btn-info { background-color: #39b3d7; border-color: #269abc; }[type="submit"] { width: 100px; margin-left: 260px; float: right; visibility: hidden; }.upload_ul { display: none; width: 100%; border: 1px solid #bbb; background-color: #fff; font-size: 12px; }.upload_ul > li { display: table-row; opacity: 1; overflow: hidden; -webkit-transition: opacity .2s; transition: opacity .2s;background-image:-webkit-linear-gradient(top, #ABD9FF, #88C9FF);background-image:        linear-gradient(to bottom, #ABD9FF, #88C9FF);-moz-background-size: 0% 100%;background-size: 0% 100%;background-repeat: no-repeat;}.upload_title { color: #666; background-color: #f0f0f0; }.upload_cell { display: table-cell; padding: 5px 10px; border-top: 1px solid #ddd; vertical-align:middle; }.upload_cell:first-child { width: 50%; }.waiting{ color: #999; }.uploading { color: #069; }.canceling { color: #CE4625; }.success { color: green; }.error { color: #f30; }.remind { padding: 5px 10px; background-color: #eee; margin-top: 40px; color: #666; font-size: 12px;}/*icon copyright by weiyun */.icon { display: inline-block; width: 30px; height: 30px; background: url(res/file-small.png) no-repeat -74px -490px; vertical-align: middle; }.icon-doc,.icon-docx{background-position:0 0}.icon-ppt,.icon-pptx{background-position:-37px 0}.icon-xls,.icon-xlsx{background-position:-74px 0}.icon-pdf,.ico-pdf{background-position:-111px 0}.icon-txt,.ico-txt{background-position:-148px 0}.icon-msg,.ico-msg{background-position:0 -35px}.icon-rp,.ico-rp{background-position:-37px -35px}.icon-vsd,.ico-vsd{background-position:-74px -35px}.icon-ai,.ico-ai{background-position:-111px -35px}.icon-eps,.ico-eps{background-position:-148px -35px}.icon-log,.ico-log{background-position:0 -70px}.icon-xmin,.ico-xmin{background-position:-37px -70px}.icon-cab,.ico-cab{background-position:-74px -70px}.icon-psd,.ico-psd{background-position:0 -105px}.icon-jpg,.ico-jpg{background-position:-37px -105px}.icon-jpeg,.ico-jpeg{background-position:-37px -105px}.icon-png,.ico-png{background-position:-74px -105px}.icon-gif,.ico-gif{background-position:-111px -105px}.icon-bmp,.ico-bmp{background-position:-148px -105px}.icon-rmvb,.ico-rmvb{background-position:0 -140px}.icon-rm,.ico-rm{background-position:0 -140px}.icon-mod,.ico-mod{background-position:-37px -140px}.icon-mov,.ico-mov{background-position:-74px -140px}.icon-3gp,.ico-3gp{background-position:-111px -140px}.icon-avi,.ico-avi{background-position:-148px -140px}.icon-swf,.ico-swf{background-position:0 -175px}.icon-flv,.ico-flv{background-position:-37px -175px}.icon-mpe,.ico-mpe{background-position:-74px -175px}.icon-asf,.ico-asf{background-position:-111px -175px}.icon-wmv,.ico-wmv{background-position:-148px -175px}.icon-mp4,.ico-mp4{background-position:-185px -175px}.icon-wma,.ico-wma{background-position:0 -210px}.icon-mp3,.ico-mp3{background-position:-37px -210px}.icon-wav,.ico-wav{background-position:-74px -210px}.icon-apk,.ico-apk{background-position:0 -245px}.icon-ipa,.ico-ipa{background-position:-37px -245px}.icon-exe,.ico-exe{background-position:-74px -245px}.icon-msi,.ico-msi{background-position:-111px -245px}.icon-bat,.ico-bat{background-position:-148px -245px}.icon-fla,.ico-fla{background-position:0 -280px}.icon-htm,.ico-htm,.icon-html,.ico-html{background-position:-37px -280px}.icon-c,.ico-c{background-position:-111px -280px}.icon-xml,.ico-xml{background-position:-148px -280px}.icon-asp,.ico-asp{background-position:-185px -280px}.icon-chm,.ico-chm{background-position:0 -315px}.icon-hlp,.ico-hlp{background-position:-37px -315px}.icon-ttf,.ico-ttf{background-position:-111px -315px}.icon-otf,.ico-otf{background-position:-148px -315px}.icon-rar,.ico-rar{background-position:0 -350px}.icon-zip,.ico-zip{background-position:-37px -350px}.icon-tar,.ico-tar{background-position:-74px -350px}.icon-cab,.ico-cab{background-position:-111px -350px}.icon-uue,.ico-uue{background-position:-148px -350px}.icon-jar,.ico-jar{background-position:0 -385px}.icon-7z,.ico-7z{background-position:-37px -385px}.icon-iso,.ico-dmg{background-position:-74px -385px}.icon-dmg,.ico-dmg{background-position:-111px -385px}.icon-ace,.ico-ace{background-position:-148px -385px}.icon-bak,.ico-bak{background-position:0 -420px}.icon-tmp,.ico-tmp{background-position:-37px -420px}.icon-old,.ico-old{background-position:-74px -420px}.icon-document,.ico-document{background-position:0 -455px}.icon-exec,.ico-exec{background-position:-37px -455px}.icon-code,.ico-code{background-position:-74px -455px}.icon-image,.ico-image{background-position:-111px -455px}.icon-video,.ico-video{background-position:-148px -455px}.icon-audio,.ico-audio{background-position:0 -490px}.icon-compress,.ico-compress{background-position:-37px -490px}.icon-unknow,.ico-unknow{background-position:-74px -490px}.icon-filebroken,.ico-filebroken{background-position:-111px -490px}.icon-link,.ico-link{background-position:-111px -418px}</style></head><body><div id="header"></div><div id="main"><h1>Ajax文件上传断点续传页面</h1>    <div id="body" class="light">    <div id="content" class="show">        <h3>Ajax断点续传展示</h3>            <div class="article_new"></div>            <div class="demo">            <div class="upload">                    <form id="form" class="form" action="/ipcc/AjaxFilesUploadServlet" enctype="multipart/form-data" >                        <input id="file" class="file" name="file[]" multiple="" type="file"><span class="btn btn-info">请选择要上传的文件(小于1G)</span>                        <input id="submit" class="btn btn-primary" value="上传" type="submit">                    </form>                    <ul id="uploadUl" class="upload_ul">                        <li class="upload_title">                            <div class="upload_cell">标题</div>                            <div class="upload_cell">类型</div>                            <div class="upload_cell">大小</div>                            <div class="upload_cell">状态</div>                            <div class="upload_cell">操作</div>                        </li>                    </ul>                    <p class="remind">1. 点击默认展示的按钮选择文件;<br>2. 点击后出现的上传按钮进行上传</p>                </div>            </div>        </div>           </div></div><script id="fileTemplate" type="text/template"><li id="filelist_$id$"><div class="upload_cell">$name$</div><div class="upload_cell"><i class="icon icon-$type$"></i></div><div class="upload_cell">$size$</div><div id="filestatus_$id$" class="upload_cell">$status$</div><div id="fileoperate_$id$" class="upload_cell">$operate$</div></li></script><script>var $ = function(id) {return document.getElementById(id);};// 一些元素var eleForm = $("form"), eleFile = $("file"), eleSubmit = $("submit"),// 文件等待上传列表的容器eleUploadUl = $("uploadUl"),// 模板元素eleTemplate = $("fileTemplate");// 上传文件队列数组var fileArray = [], // 文件分割上传的间隙大小 10M fileSplitSize = 1024 * 1024 * 10 ,// 模板HTMLhtmlTemplate = eleTemplate && eleTemplate.innerHTML || '';if (typeof history.pushState == "function") {// 一些元素的状态var objStateElement = (function() {var _$ = function(name, fileid) {return $("file"+ name +"_" + fileid) || { innerHTML: "" };};return {// 上传进度条背景的控制backgroundSize: function(params, percent) {var dom = typeof params == "string"? $("filelist_" + params): params;if (dom) {dom.style.mozBackgroudSize = percent + "% 100%";dom.style.backgroundSize = percent + "% 100%";}},wait: function(fileid) {// 一些状态的改变_$("status", fileid).innerHTML = '<span class="uploading">上传中...</span>';_$("operate", fileid).innerHTML = '<a href="javascript:" data-type="pause" data-id="'+ fileid +'">暂停</a>';},keep: function(fileid) {_$("status", fileid).innerHTML = '<span class="waiting">等待续传...</span>';},success: function(fileid, time) {var eleList = $("filelist_" + fileid), eleOperate = $("fileoperate_" + fileid), eleStatus = $("filestatus_" + fileid);// 进度条隐藏this.backgroundSize(eleList, "0");// 因为元素不会删除,因此,有必要清除ideleStatus.id = "";eleOperate.id = "";eleList.id = "";// 删除本地存储的起点,完全上传成功,因此没有续传的必要localStorage.removeItem(fileid);// 状态信息再变化eleStatus.innerHTML = '<span class="success">'+ ((performance.now() - time > 1000)? "上": "秒") +'传成功!</span>';eleOperate.innerHTML = '';console.log([performance.now(), time].join());},error: function(fileid) {// 状态信息再变化_$("status", fileid).innerHTML = '<span class="error">出现异常!</span>';_$("operate", fileid).innerHTML = '<a href="javascript:" data-type="try" data-id="'+ fileid +'">重试</a>';}}})();// 单文件上传var funFileUpload = function(fileid, onsuccess, onerror, onpause) {var file = fileArray[fileid], now = performance.now();if (!fileid || !file) return;onsuccess = onsuccess || function() {funFileUpload(fileArray[0]);};onerror = onerror || function() {funFileUpload(fileArray[fileArray.indexOf(fileid) + 1]);};onpause = onpause || function() {funFileUpload(fileArray[fileArray.indexOf(fileid) + 1]);};if (file.flagPause == true) {onpause.call(fileid);return;}objStateElement.wait(fileid);// 文件分割上传// 文件大小和分割起点// 注释的是本地存储实现var size = file.size, /*start = localStorage[fileid] * 1 || 0*/ start = $("filelist_" + fileid).filesize;if (size == start) {// 已经传过了fileArray.shift();if (delete fileArray[fileid]) console.log(fileArray.join() + "---上传成功");objStateElement.success(fileid, now);// 回调onsuccess.call(fileid, {});return;}var funFileSize = function() {if (file.flagPause == true) {onpause.call(fileid);return;}var data = new FormData();data.append("name", encodeURIComponent(file.name));data.append("fileid", fileid);data.append("file", file.slice(start, start + fileSplitSize));data.append("start", start + "");var p = "?name="+encodeURIComponent(file.name)+"&fileid"+fileid+"&start"+start;// XMLHttpRequest 2.0 请求var xhr = new XMLHttpRequest();xhr.open("post", eleForm.action, true);//xhr.setRequestHeader("X_Requested_With", location.href.split("/")[5].replace(/[^a-z]+/g,"$"));           // xhr.setRequestHeader("Content-type", "multipart/form-data");// 上传进度中xhr.upload.addEventListener("progress", function(e) {objStateElement.backgroundSize(fileid, (e.loaded + start) / size * 100);}, false);// ajax成功后xhr.onreadystatechange = function(e) {if (xhr.readyState == 4) {if (xhr.status == 200) {try {var json = JSON.parse(xhr.responseText);} catch (e) {objStateElement.error(fileid);return;} //var json = JSON.parse(xhr.responseText);if (!json || !json.succ) {objStateElement.error(fileid);onerror.call(fileid, json);return;}if (start + fileSplitSize >= size) {// 超出,说明全部分割上传完毕// 上传队列中清除者一项fileArray.shift();if (delete fileArray[fileid]) console.log(fileArray.join() + "---上传成功");objStateElement.success(fileid, now);// 回调onsuccess.call(fileid, json);} else {// 尚未完全上传完毕// 存储上传成功的文件点,以便出现意外的时候,下次可以断点续传localStorage.setItem(fileid, start + "");// 改变下一部分文件的起点位置start += fileSplitSize;console.log(start);// 上传下一个分割文件funFileSize();}} else {objStateElement.error(fileid);}}};xhr.send(data);};// 文件分割上传开始funFileSize();};// IE10+, Chrome, FireFox等~eleForm.addEventListener("submit", function(event) {funFileUpload(fileArray[0]);event.preventDefault();});// 选择文件后eleFile.addEventListener("change", function(event) {// 获取文件var files = event.target.files;// 遍历文件,显示文件列表信息var htmlFile = '', index = 0, length = files.length;for (; index < length; index++) {var file = files[index];    // Blob对象相关知识可参考:http://www.zhangxinxu.com/wordpress/?p=3725// console.log(file.type);var name = file.name, size = file.size, type = file.type || "", id = (file.lastModifiedDate + "").replace(/\W/g, '') + size + type.replace(/\W/g, '');var objHtml = {id: id,type: 'cloud',name: name,size: size + "B",status: '<span class="waiting">等待上传</span>',operate: '<a href="javascript:" data-type="delete" data-id="'+ id +'">删除</a>'}// name 50字符限制if (name.length > 50) {objHtml.name = '<span title="'+ name +'">'+ name.slice(0,20) + '...' + name.slice(-20) +'</span>';}// 文件类型与对应的图标var format = name.split(".");objHtml.type = format[format.length - 1] || "unknown";// 如果大小大于1M使用'M'为单位表示, 1位小数点if (size > 1024 * 1024) {objHtml.size = Math.round(size / (1024 * 1024) * 10) / 10 + "M";} else if (size > 1024) {// 如果大小大于1KB使用'KB'为单位表示, 1位小数点objHtml.size = Math.round(size / 1024 * 10) / 10 + "KB";}if (size > 1024 * 1024 * 1024) {// 如果文件大于1G, 状态为'大小溢出'objHtml.id = Math.random();objHtml.status = '<span class="error">文件过大</span>';objHtml.operate = '';} else if (fileArray.indexOf(id) != -1) {// 如果文件已经在列表中objHtml.id = Math.random();objHtml.status = '<span class="error">文件已存在</span>';objHtml.operate = '';} else {// 加入文件队列,并缓存对应的文件二进制对象fileArray.push(id);fileArray[id] = file;}htmlFile += htmlTemplate.replace(/\$\w+\$/gi, function(matchs) {var returns = objHtml[matchs.replace(/\$/g, "")];return (returns + "") == "undefined"? "": returns;});}// 载入HTMLif (htmlFile !== '') {eleSubmit.style.visibility = "visible";eleUploadUl.style.display = "table";eleUploadUl.insertAdjacentHTML("beforeEnd", htmlFile);// 初始化进度条// 下面注释的是本地存储方法/*fileArray.forEach(function(fileid) {var loaded = localStorage[fileid] * 1;if (loaded > 0) {objStateElement.backgroundSize(fileid, loaded / fileArray[fileid].size * 100);}});*/// 现在直接使用Ajax请求var nameArray = fileArray.map(function(fileid) {                //var nameSplit = fileArray[fileid].name.split("."),//name = nameSplit[nameSplit.length - 1];  原来是用了扩展名var name = nameSplit = fileArray[fileid].namereturn fileid + "!" + name;});var xhr_filesize = new XMLHttpRequest();xhr_filesize.open("GET", "/ipcc/AjaxFilesUploadServlet?filename=" + nameArray.join(), true);xhr_filesize.onreadystatechange = function(e) {if (xhr_filesize.readyState == 4) {if (xhr_filesize.status == 200 && xhr_filesize.responseText) {var json = JSON.parse(xhr_filesize.responseText);if (json.succ && json.data) {for (var key in json.data) {if (json.data[key] > 0 && json.data[key] < fileArray[key].size) {objStateElement.backgroundSize(key, json.data[key] / fileArray[key].size * 100);objStateElement.keep(key);} $("filelist_" + key).filesize = json.data[key];}}}}};xhr_filesize.send();}eleForm.reset();});// 文件删除等委托事件eleUploadUl.addEventListener("click", function(event) {var target = event.target, id = target && target.getAttribute("data-id");if (id && /^a$/i.test(target.tagName)) {switch (target.getAttribute("data-type")) {case "delete": {var filelist = $("filelist_" + id);if (filelist) {filelist.style.opacity = 0;// 源数据清除fileArray.splice(fileArray.indexOf(id), 1);if (delete fileArray[id]) console.log(fileArray.join() + "---删除成功");setTimeout(function() { filelist.parentNode.removeChild(filelist); if (fileArray.length == 0) {eleSubmit.style.visibility = "hidden";eleUploadUl.style.display = "none";}}, 220);}break;}case "pause": {var eleStatus = $("filestatus_" + id);if (fileArray[id]) {fileArray[id].flagPause = true;target.setAttribute("data-type", "reupload");target.innerHTML = "继续";if (eleStatus) eleStatus.innerHTML = "上传暂停";}break;}case "try": case "reupload": {funFileUpload(id, function() {}, function() {}, function() {});}}}});} else {eleUploadUl.style.display = "block";eleUploadUl.innerHTML = '<li class="error"><p style="margin:.5em 1em;">当前浏览器不支持!试试IE10+, Chrome等~</p></li>';}</script></body></html>
 3、 使用到的 css 

1 btn.css

.btn {  display: inline-block;  padding: 6px 12px;  margin-bottom: 0;  font-size: 14px;  font-weight: normal;  line-height: 1.428571429;  text-align: center;  white-space: nowrap;  vertical-align: middle;  cursor: pointer;  background-image: none;  border: 1px solid transparent;  border-radius: 4px;  -webkit-user-select: none;     -moz-user-select: none;      -ms-user-select: none;       -o-user-select: none;          user-select: none;}.btn:focus {  outline: thin dotted #333;  outline: 5px auto -webkit-focus-ring-color;  outline-offset: -2px;}.btn:hover,.btn:focus {  color: #333333;  text-decoration: none;}.btn:active,.btn.active {  background-image: none;  outline: 0;  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);}.btn.disabled,.btn[disabled],fieldset[disabled] .btn {  pointer-events: none;  cursor: not-allowed;  opacity: 0.65;  filter: alpha(opacity=65);  -webkit-box-shadow: none;          box-shadow: none;}.btn-default {  color: #333333;  background-color: #ffffff;  border-color: #cccccc;}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default {  color: #333333;  background-color: #ebebeb;  border-color: #adadad;}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default {  background-image: none;}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active {  background-color: #ffffff;  border-color: #cccccc;}.btn-primary {  color: #ffffff;  background-color: #428bca;  border-color: #357ebd;}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary {  color: #ffffff;  background-color: #3276b1;  border-color: #285e8e;}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary {  background-image: none;}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active {  background-color: #428bca;  border-color: #357ebd;}.btn-warning {  color: #ffffff;  background-color: #f0ad4e;  border-color: #eea236;}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning {  color: #ffffff;  background-color: #ed9c28;  border-color: #d58512;}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning {  background-image: none;}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active {  background-color: #f0ad4e;  border-color: #eea236;}.btn-danger {  color: #ffffff;  background-color: #d9534f;  border-color: #d43f3a;}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger {  color: #ffffff;  background-color: #d2322d;  border-color: #ac2925;}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger {  background-image: none;}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active {  background-color: #d9534f;  border-color: #d43f3a;}.btn-success {  color: #ffffff;  background-color: #5cb85c;  border-color: #4cae4c;}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success {  color: #ffffff;  background-color: #47a447;  border-color: #398439;}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success {  background-image: none;}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active {  background-color: #5cb85c;  border-color: #4cae4c;}.btn-info {  color: #ffffff;  background-color: #5bc0de;  border-color: #46b8da;}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info {  color: #ffffff;  background-color: #39b3d7;  border-color: #269abc;}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info {  background-image: none;}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active {  background-color: #5bc0de;  border-color: #46b8da;}.btn-link {  font-weight: normal;  color: #428bca;  cursor: pointer;  border-radius: 0;}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link {  background-color: transparent;  -webkit-box-shadow: none;          box-shadow: none;}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active {  border-color: transparent;}.btn-link:hover,.btn-link:focus {  color: #2a6496;  text-decoration: underline;  background-color: transparent;}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus {  color: #999999;  text-decoration: none;}.btn-lg {  padding: 10px 16px;  font-size: 18px;  line-height: 1.33;  border-radius: 6px;}.btn-sm,.btn-xs {  padding: 5px 10px;  font-size: 12px;  line-height: 1.5;  border-radius: 3px;}.btn-xs {  padding: 1px 5px;}.btn-block {  display: block;  width: 100%;  padding-right: 0;  padding-left: 0;}.btn-block + .btn-block {  margin-top: 5px;}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block {  width: 100%;}

 2.demo.css

body{background:#a0b3d6; font-size:84%; margin:0; line-height:1.5; color:#333; font-family:Arial, sans-serif;}a{color:#34538b; text-decoration:none;}a:hover{text-decoration:underline;}input,select,textarea{font-size:100%;}#header{height:60px; padding:0 0 0 40px;}#header .logo{margin-top:12px; overflow:hidden; float:left;}#main{width:100%; background:#beceeb; overflow:hidden;}#main h1{line-height:40px; margin:0; text-align:center; font-size:1.3em; background:#c1d5eb; font-family:'kaiti','microsoft yahei'; text-shadow:0px 1px 0px #f2f2f2;}#body{padding:0; overflow:hidden;}#body .part{width:50%; min-height:500px; _height:500px; background:white;}#code{float:left; margin-left:-1px; margin-bottom:-999em; padding-bottom:999em;}#effect{float:right; margin-right:-1px; margin-bottom:-999em; padding-bottom:999em;}#body h3{line-height:30px; margin:0; font-size:1.1em; background:#f0f3f9; padding-left:10px; border-bottom:1px solid #ededed; color:#4e4e4e; text-shadow:0px 1px 0px white;}#footer{line-height:1.3; padding:15px 0; border-top:1px solid #486aaa; font-family:'Lucida Grande',Verdana, Sans-Serif; text-align:center; text-shadow:1px 1px #cad5eb;}#footer:before{display:block; height:1px; content:''; background-color:#909BAF; color:#aaa; overflow:hidden; position:relative; top:-15px;}#footer img{margin-bottom:-3px;}.show{padding-bottom:20px;}.show h5{font-size:0.9em; line-height:20px; padding:0 0 2px 2px; margin:10px 8px 0; border-bottom: 1px dotted #e5e5e5;}.show .demo{padding:10px; *zoom:1;}.show .demo:after{display:table; content:""; clear:both;}pre{font-family:'simsun';}#ad, .ad {width:468px; height:60px; margin:0 auto; color: #fff; }.ad { position: absolute; top: 0; right: 0; text-align: center; font-size: 12px; background-color: #67748A; background-color: rgba(0,0,0,.35); }@media screen and (max-width: 468px) {    #ad { display: none; }}@media screen and (max-width: 700px) {   .ad { display: none; }}.light{background:#f0f3f9;}#content{min-height:500px; _height:500px; background:white; border:solid #cad5eb; border-width:0 2px; font-family:'Lucida Grande',Verdana;}.article{font-family:Arial; padding:10px 0; font-size:0.86em; clear:both;}.article_new{ margin:-33px 10px 0 0; font-family:Arial; padding:10px 0; font-size:0.86em; clear:both; text-align:right;}#back{margin-top:-25px; position:absolute; right:10px;}

  3.hl.css

/* Generics */.DlHighlight{  font:13px/1.3 monospace;  padding:5px 10px;  margin:0;  white-space:pre-wrap;  word-wrap:break-word;}.DlHighlight pre{margin:0; padding:0;}.DlHighlight .keyword{color:#00f;}.DlHighlight .builtin{color:#22c;}.DlHighlight .string{color:#282;}.DlHighlight .string .before, .DlHighlight .string .after{color:#040;}.DlHighlight .regexp{color:#b2c;}.DlHighlight .regexp .before, .DlHighlight .regexp .after{color:#509;}.DlHighlight .comment{color:#c22;}.DlHighlight .comment-line{color:#999999;}.css .comment-line{color:#22c;}.DlHighlight .comment .before, .DlHighlight .comment .after{color:#baa;}.DlHighlight .hashkey{color:#a51;}.DlHighlight .hasharrow{color:#f00;}.DlHighlight .paren{color:#000099;}.DlHighlight .operator{color:#077;}.DlHighlight .error{background-color:#c00; color:#fff;}.DlHighlight .defun{}.DlHighlight .line-numbers {  float:left;  margin-left:-4.5em;  width:3em;  text-align:right;  color:#999;  font:0.9em tahoma,verdana,sans-serif;  padding-top:0.05em;}.DlHighlight .line-numbers:after{content:"." }/* XML */.DlHighlight .xml-tag-close .before{color:#52a;}.DlHighlight .xml-entity{color:#b2a;}.DlHighlight .xml-entity .before, .DlHighlight .xml-entity .after{color:#607;}.DlHighlight .xml-tag{font-weight:normal;}/* CSS */.DlHighlight .css-block-open,.DlHighlight .css-block-close{color:#ff00ff;}.DlHighlight .css-class{color:#ff00ff;}.DlHighlight .css-pseudo-class{color:#777;}.DlHighlight .css-id{color:#ff00ff;}.DlHighlight .css-color-spec{color:#0000ff;}.DlHighlight .css-length{color:#0000ff;}.DlHighlight .css-length .after{}.DlHighlight .css-declaration-kw{color:#000099;}.DlHighlight .css-comma{color:red;}
4 使用到的图片 


5 运行效果图 





1 0