您当前的位置: 首页 >  servlet

梁云亮

暂无认证

  • 1浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

基于Servlet3的文件上传

梁云亮 发布时间:2019-11-08 09:51:44 ,浏览量:1

基于Servlet3的文件上传

在 早期版本的Servlet中,实现文件上传功能,一般都需要借助第三方开源组件,例如 Apache 的 commons-fileupload 组件,在 Servlet3.0 中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用 Servlet3.0 提供的 API 就能够实现文件上传功能了。 Servlet3将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。

Servlet3没有提供直接获取文件名的方法,需要从请求头中解析出来请求头的格式:

火狐和google浏览器下: form-data; name="file"; filename="snmp4j--api.zip"
IE浏览器下: form-data; name="file"; filename="E:\snmp4j--api.zip"
示例1:基于JavaScript的单文件上传
  • 前端页面

    
    
        
            Servlet3单文件上传
        
        
            
            
                上传文件:
                
            
        
    
    

注意:文件上传时必须要设置表单的 enctype=“multipart/form-data”

  • 后台Servlet

    @MultipartConfig    //标识Servlet支持文件上传
    @WebServlet(urlPatterns = "/singleFileUpload")
    public class SingleFileUploadServlet extends HttpServlet {
        @Override
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
    
            String savePath = request.getServletContext().getRealPath("/uploadFile");  //存储路径
            File path = new File(savePath);
        	if(!path.exists()) { //如果路径不存在则创建
                path.mkdirs();
        	}
        	
            Collection parts = request.getParts(); //获取上传的文件集合
            if (parts != null && parts.size() == 1) {   //上传单个文件
                Part part = request.getPart("file"); //通过表单file控件()的名字直接获取Part对象
                String header = part.getHeader("content-disposition");//获取请求头
                String fileName = getFileName(header); //获取文件名
                part.write(savePath + File.separator + fileName);           //把文件写到指定路径
            }
            PrintWriter out = response.getWriter();
            out.println("上传成功");
            out.flush();
            out.close();
        }
        /**
         * 根据请求头解析出文件名
         * @param header 请求头
         * @return 文件名
         */
        public String getFileName(String header) {
            String[] temp = header.split(";")[2].split("=");
            //获取文件名,兼容各种浏览器的写法
            String fileName = temp[1].substring(temp[1].lastIndexOf("\\") + 1).replaceAll("\"", "");
            return fileName;
        }
    
    }
    
示例2:基于JQuery的单文件上传
  • 前端页面

    
    
        
            $Title$
            
            
                function uploadFile(){
                    var formData = new FormData();
                    formData.append("file",$("#file")[0].files[0]);
                    formData.append("info",'haha');
                    $.ajax({
                        url:'${pageContext.request.contextPath}/singleFileUpload', /*接口域名地址*/
                        type:'post',
                        data: formData,
                        contentType: false,
                        processData: false,
                        success:function(res){//字符串
                    		console.log(res);
                    		var json = eval('('+res+')');//字符串转JSON
                    		console.log(json.data);
                		}
                    })
                }
            
        
        
            
            上传文件
        
    
    
  • 后台代码

    @MultipartConfig    //标识Servlet支持文件上传
    @WebServlet(urlPatterns = "/singleFileUpload")
    public class SingleFileUploadServlet extends HttpServlet {
        @Override
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
    
            String savePath = request.getServletContext().getRealPath("/uploadFile");  //存储路径
            File path = new File(savePath);
            if (!path.exists()) {
                path.mkdirs();
            }
            System.out.println(request.getParameter("info"));
            Part part = request.getPart("file"); //通过表单file控件()的名字直接获取Part对象
            String header = part.getHeader("content-disposition");//获取请求头
            String fileName = getFileName(header); //获取文件名
            part.write(savePath + File.separator + fileName);           //把文件写到指定路径
            PrintWriter out = response.getWriter();
            out.println("{\"data\":\"上传成功\"}");
            out.flush();
            out.close();
        }
    
        /**
         * 根据请求头解析出文件名
         *
         * @param header 请求头
         * @return 文件名
         */
        public String getFileName(String header) {
            String[] temp = header.split(";")[2].split("=");
            //获取文件名,兼容各种浏览器的写法
            String fileName = temp[1].substring(temp[1].lastIndexOf("\\") + 1).replaceAll("\"", "");
            return fileName;
        }
    
    }
    
示例3:多文件上传
  • 前端页面

    
    
    
        
            Servlet3多文件上传
        
        
            
            
                上传文件:
                上传文件:
                
            
        
    
    
  • 后台Servlet

    @MultipartConfig//标识Servlet支持文件上传
    //使用@WebServlet配置UploadServlet的访问路径
    @WebServlet(urlPatterns = "/multiFileUpload")
    public class MultiFileUploadServlet extends HttpServlet {
        @Override
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            //存储路径
            String savePath = request.getServletContext().getRealPath("/uploadFile");
            File path = new File(savePath);
            if(!path.exists()) {
                path.mkdirs();
            }
            Collection parts = request.getParts();        //获取上传的文件集合
            if (parts != null && parts.size() > 1) { //一次性上传多个文件
                for (Part part : parts) {//循环处理上传的文件
                    String header = part.getHeader("content-disposition");//获取请求头
                    //获取文件名
                    String fileName = getFileName(header);
                    //把文件写到指定路径
                    part.write(savePath + File.separator + fileName);
                }
                PrintWriter out = response.getWriter();
                out.println("上传成功");
                out.flush();
                out.close();
            }
        }
        /**
         * 根据请求头解析出文件名
         * @param header 请求头
         * @return 文件名
         */
        public String getFileName(String header) {
            String[] temp = header.split(";")[2].split("=");
            //获取文件名,兼容各种浏览器的写法
            String fileName = temp[1].substring(temp[1].lastIndexOf("\\") + 1).replaceAll("\"", "");
            return fileName;
        }
    
    }
    
示例4:任意多文件上传
  • 前端页面

    
    
    	
    	    动态添加文件上传列表
    	    
    	        function addFile(event) {
    	            //创建一个div标签,用以包含一个input标签和删除按钮
    	            var innerdiv = document.createElement("div");
    	
    	            //创建一个input标签
    	            var inputNode = document.createElement("input");
    	            inputNode.name = "fileName";  
    	            inputNode.type = "file";
    	
    	            //创建一个删除按钮
    	            var delNode = document.createElement("input");
    	            delNode.name = "del";
    	            delNode.type = "button";
    	            delNode.value = "删除";
    	
    	            //删除当前删除按钮所在的标签,为此按钮点击事件创建一个处理函数
    	            delNode.onclick = function d() {
    	                this.parentNode.parentNode.removeChild(this.parentNode); //删除此div区域
    	                var fileNodes = document.getElementsByName("fileName");
    	            };
    	
    	            innerdiv.appendChild(inputNode);
    	            innerdiv.appendChild(delNode);
    	
    	            var div = document.getElementById("file");
    	            div.appendChild(innerdiv);
    	        }
    	    
    	
    	
    	    
    	        上传文件: 
    	        
    	        
    	    
    	
    
    
  • 后台Servlet

    @MultipartConfig//标识Servlet支持文件上传
    //使用@WebServlet配置UploadServlet的访问路径
    @WebServlet(urlPatterns = "/fileUpload")
    public class FileUploadServlet extends HttpServlet {
        @Override
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            //存储路径
            String savePath = request.getServletContext().getRealPath("/uploadFile");
            File path = new File(savePath);
            if(!path.exists()) {
                path.mkdirs();
            }
            //获取上传的文件集合
            Collection parts = request.getParts();
            if (parts.size() == 1) {//一次上传单个文件
                Part part = request.getPart("fileName");//通过表单file控件()的名字直接获取Part对象
                String header = part.getHeader("content-disposition"); //获取请求头
                String fileName = getFileName(header);     //获取文件名
                part.write(savePath + File.separator + fileName);    //把文件写到指定路径
            } else {  //一次性上传多个文件
                for (Part part : parts) {//循环处理上传的文件
                    //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"
                    String header = part.getHeader("content-disposition");
                    //获取文件名
                    String fileName = getFileName(header);
                    //把文件写到指定路径
                    part.write(savePath + File.separator + fileName);
                }
            }
            PrintWriter out = response.getWriter();
            out.println("上传成功");
            out.flush();
            out.close();
        }
    
        /**
         * 根据请求头解析出文件名
         * @param header 请求头
         * @return 文件名
         */
        public String getFileName(String header) {
            String[] temp = header.split(";")[2].split("=");
            //获取文件名,兼容各种浏览器的写法
            String fileName = temp[1].substring(temp[1].lastIndexOf("\\") + 1).replaceAll("\"", "");
            return fileName;
        }
    
    }
    
  • 页面效果: 在这里插入图片描述

关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0457s