• 文件的批量上传


      本次使用的Spring的文件批量上传,前台使用ajax方式,并显示进度条.

      

      导包

    <!-- 文件上传下载包 -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>

      页面代码

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <!-- <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script> -->
        <!-- 引入全局 stylesheet 和 script -->
        <jsp:include page="${contextPath}/views/common/script.jsp"/>
        <jsp:include page="${contextPath}/views/common/stylesheet.jsp"/>
        <title>Insert title here</title>
    </head>
    <body>
    
    <div class="progress" style="display: none;">
        <div class="progress-bar" role="progressbar" aria-valuenow="60"
             aria-valuemin="0" aria-valuemax="100" style=" 0;">
            <span id="checkProgress"></span>
        </div>
    </div>
    
    <form id="uploadForm" enctype="multipart/form-data">
        用户名:<input type="text" name="user"/><br/>
        文件1:<input type="file" name="file"/><br/>
        文件2:<input type="file" name="file02"/><br/>
    </form>
    <button id="upload">上传文件</button>
    
    
    
    <form enctype="multipart/form-data" method="post" action="file/upload.action">
        文件3:<input type="file" name="file" multiple="multiple" /><br/>
      
        <input type="submit" value="提交">
    </form>
    
    </body>
    
    <script type="text/javascript">
        $(function () {
            var pro;
            $("#upload").click(function () {
                //显示样式
                $(".progress").show();
                pro = setInterval(progress,1000);
                var formData = new FormData($('#uploadForm')[0]);
                formData.append("param","bbbbbbbbbbb");
                $.ajax({
                    type: 'post',
                    url: "file/upload.action",
                    data: formData,
                    cache: false,
                    processData: false,
                    contentType: false,
                }).success(function (data) {
                    alert(data);
                }).error(function () {
                    clearInterval(pro);
                    $(".progress").css("display","none");
                    alert("上传失败");
                });
               
            });
            function progress () {
                $.ajax({
                    type: 'post',
                    url: "file/getProgress.action",
                    data: {},
                    cache: false,
                    processData: false,
                    contentType: "application/json",
                }).success(function (data) {
                    if(typeof (data.percent) != "undefind" && data.percent != null){
                       var per = data.percent +'%';
                        $(".progress-bar").css("width",per);
                        $("#checkProgress").html(per);
                        if(per == "100%"){
                            clearInterval(pro);
                            $(".progress").hide();
                        }
                    }
                    console.log(data);
                }).error(function () {
                    alert("上传失败");
                });
            }
    
        });
    </script>
    
    </html>

      控制层代码

    /**
         * 文件的上传
         * @param request
         * @return
         */
        @RequestMapping(value="/upload",method = RequestMethod.POST)
        @ResponseBody
        public Object upload(HttpServletRequest request){
        	//获取数据测试
        	String user = request.getParameter("user");
        	String param = request.getParameter("param");
            String contextPath = request.getSession().getServletContext().getRealPath("/data");
            String path = contextPath+"/diagrams";
            Object[] fileLastName = {".zip",".doc",".docx",".txt",".iso"};
            //创建一个通用的多部分解析器
            CustomMultipartResolver multipartResolver = new CustomMultipartResolver(request.getSession().getServletContext());
            multipartResolver.setDefaultEncoding("utf-8");
            //判断是否有文件上传
            if(multipartResolver.isMultipart(request)){
                //转化成request
                MultipartHttpServletRequest multipartRequest =(MultipartHttpServletRequest)(request);
                //取得request中的所有文件
                Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
                Collection<MultipartFile> files = fileMap.values();
                int size = files.size();//文件的数量
                if(size > 6){
                    return "上传数量不得大于6个";
                }
                if(size == 0) {
                	return "没有文件或者刷新页面重新上传";
                }
                //遍历上传文件
                for (MultipartFile file:files) {
                    long startMillis = System.currentTimeMillis();//文件上传的开始时间
                    if(file != null){
                        String name = file.getName();//获取jsp页面中name中的值
                        String fileName = file.getOriginalFilename();//获得上传文件的名称
                        if(StringUtils.isBlank(fileName)){
                            continue;
                        }
                        int lastNum = fileName.lastIndexOf(".");
                        String suffix = fileName.substring(lastNum, fileName.length());//判断文件的结尾
                        //判断后缀名是否符合标准
                        boolean contains = ArrayUtils.contains(fileLastName,suffix);
                        if(!contains){
                            return "后缀名不合法";
                        }
                    }
                    try {
                        String filePath = path+file.getOriginalFilename()+new Date().getTime();
                        file.transferTo(new File(filePath));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return "上传成功";
        }


    @RequestMapping(value = "/getProgress",method = RequestMethod.POST) @ResponseBody public ProgressEntity initCreateInfo(HttpServletRequest request) { ProgressEntity status = (ProgressEntity) request.getSession().getAttribute("status"); if(status==null){ return new ProgressEntity(); } return status; }



      Spring整合

     <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->
        <bean id="multipartResolver" class="ch.system.rebean.CustomMultipartResolver">
           <!-- <property name="maxUploadSize" value="3"/>
            <property name="maxInMemorySize" value="4096"/>-->
            <property name="defaultEncoding" value="UTF-8"></property>
        </bean>

      

      文件上传的重写

    package ch.system.rebean;
    
    import ch.system.listener.MyProgressListener;
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUpload;
    import org.apache.commons.fileupload.FileUploadBase;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.multipart.MaxUploadSizeExceededException;
    import org.springframework.web.multipart.MultipartException;
    import org.springframework.web.multipart.commons.CommonsMultipartResolver;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import java.util.List;
    
    /**
     * Description:对上传文件的重写
     *
     * @author cy
     * @date 2018年08月06日 18:05
     * version 1.0
     */
    public class CustomMultipartResolver extends CommonsMultipartResolver {
    
        @Autowired
        private MyProgressListener progressListener;
    
        public CustomMultipartResolver() {
        }
    
        public CustomMultipartResolver(ServletContext servletContext) {
            super(servletContext);
        }
    
        
        public void setFileUploadProgressListener(MyProgressListener progressListener){
            this.progressListener=progressListener;
        }
    
        @Override
        public MultipartParsingResult parseRequest(HttpServletRequest request)
                throws MultipartException {
            String encoding = determineEncoding(request);
            FileUpload fileUpload = prepareFileUpload(encoding);
            progressListener.setSession(request.getSession());
            fileUpload.setProgressListener(progressListener);
            try {
                List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
                return parseFileItems(fileItems, encoding);
            }
            catch (FileUploadBase.SizeLimitExceededException ex) {
                throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);
            }
            catch (FileUploadException ex) {
                throw new MultipartException("Could not parse multipart servlet request", ex);
            }
        }
    
    
    }

      

      进度条bean

    package ch.system.bean;
    
    /**
     * Description:文件下载读取文件的bean
     *
     * @author cy
     * @date 2018年08月06日 18:10
     * version 1.0
     */
    public class ProgressEntity {
        private long pBytesRead = 0L;   //到目前为止读取文件的比特数
        private long pContentLength = 0L;    //文件总大小
        private int pItems;                //目前正在读取第几个文件
        private int percent; // 完成比例
        private long startTime = System.currentTimeMillis(); //开始时间
        private long useTime = System.currentTimeMillis(); //已用时间
        
    
        public long getpBytesRead() {
            return pBytesRead;
        }
        public void setpBytesRead(long pBytesRead) {
            this.pBytesRead = pBytesRead;
        }
        public long getpContentLength() {
            return pContentLength;
        }
        public void setpContentLength(long pContentLength) {
            this.pContentLength = pContentLength;
        }
        public int getpItems() {
            return pItems;
        }
        public void setpItems(int pItems) {
            this.pItems = pItems;
        }
        public int getPercent() {
            return percent;
        }
        public void setPercent(int percent) {
            this.percent = percent;
        }
        public long getStartTime() {
            return startTime;
        }
        public void setStartTime(long startTime) {
            this.startTime = startTime;
        }
        public long getUseTime() {
            return useTime;
        }
        public void setUseTime(long useTime) {
            this.useTime = useTime;
        }
        @Override
        public String toString() {
            float tmp = (float)pBytesRead;
            float result = tmp/pContentLength*100;
            return "ProgressEntity [pBytesRead=" + pBytesRead + ", pContentLength="
                    + pContentLength + ", percentage=" + result + "% , pItems=" + pItems + "]";
        }
    
    }

      监听器

    package ch.system.listener;
    
    import ch.system.bean.ProgressEntity;
    import org.apache.commons.fileupload.ProgressListener;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpSession;
    
    /**
     * Description:文件上传的监听器
     *
     * @author cy
     * @date 2018年08月06日 17:59
     * version 1.0
     */
    
    @Component
    public class MyProgressListener implements ProgressListener {
    
        private HttpSession session;
    
        public void setSession(HttpSession session){
            this.session=session;
            ProgressEntity status = new ProgressEntity();
            session.setAttribute("status", status);
        }
    
        @Override
        public void update(long pBytesRead, long pContentLength, int pItems) {
            ProgressEntity status = (ProgressEntity) session.getAttribute("status");
            status.setpBytesRead(pBytesRead);
            status.setpContentLength(pContentLength);
            status.setpItems(pItems);
            status.setUseTime(System.currentTimeMillis()-status.getStartTime());
            status.setPercent((int)(pBytesRead*100/pContentLength));
            //完成的计算已完成pBytesRead/1024/1024 M
        }
    }

    <%@ page language="java" contentType="text/html; charset=UTF-8"         pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    <!-- <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script> -->    <!-- 引入全局 stylesheet 和 script -->    <jsp:include page="${contextPath}/views/common/script.jsp"/>    <jsp:include page="${contextPath}/views/common/stylesheet.jsp"/>    <title>Insert title here</title></head><body>
    <div class="progress" style="display: none;">    <div class="progress-bar" role="progressbar" aria-valuenow="60"         aria-valuemin="0" aria-valuemax="100" style=" 0;">        <span id="checkProgress"></span>    </div></div>
    <form id="uploadForm" enctype="multipart/form-data">    用户名:<input type="text" name="user"/><br/>    文件1:<input type="file" name="file"/><br/>    文件2:<input type="file" name="file02"/><br/></form><button id="upload">上传文件</button>


    <form enctype="multipart/form-data" method="post" action="file/upload.action">    文件3:<input type="file" name="file" multiple="multiple" /><br/>      <input type="submit" value="提交"></form>
    </body>
    <script type="text/javascript">    $(function () {        var pro;        $("#upload").click(function () {        //显示样式        $(".progress").show();        pro = setInterval(progress,1000);        var formData = new FormData($('#uploadForm')[0]);            formData.append("param","bbbbbbbbbbb");            $.ajax({                type: 'post',                url: "file/upload.action",                data: formData,                cache: false,                processData: false,                contentType: false,            }).success(function (data) {                alert(data);            }).error(function () {                clearInterval(pro);                $(".progress").css("display","none");                alert("上传失败");            });                   });        function progress () {            $.ajax({                type: 'post',                url: "file/getProgress.action",                data: {},                cache: false,                processData: false,                contentType: "application/json",            }).success(function (data) {                if(typeof (data.percent) != "undefind" && data.percent != null){                   var per = data.percent +'%';                    $(".progress-bar").css("width",per);                    $("#checkProgress").html(per);                    if(per == "100%"){                        clearInterval(pro);                        $(".progress").hide();                    }                }                console.log(data);            }).error(function () {                alert("上传失败");            });        }
        });</script>
    </html>

  • 相关阅读:
    常用、好用的资源管理器收藏
    单片机延时函数整理——针对裸机
    ad7793的调试记录
    《80c51单片机实用技术》邹久朋学习笔记
    使用串口工具(volt++ vofa)伏特加来实时打印波形
    golang从简单的即时聊天来看架构演变
    无敌简单快速的文件服务器sgfs
    到底是否应该使用“微服务架构”?
    你所学习的设计模式到底有什么用?到底怎么用?
    浅入深出ETCD之【raft原理】
  • 原文地址:https://www.cnblogs.com/chengyangyang/p/9431592.html
Copyright © 2020-2023  润新知