• JavaWeb(文件上传 异步文件上传 文件下载)


    文件上传

    上传文件对表单的要求(前端<form>)
    	1.请求方式为post method="post"
    	2.enctype="multipart/form-data"
    	3.使用 文件表单项上传文件
    		用户名:<input type="text" name="username">
    		文件:<input type="file" name="photo">
    		<input type="submit" value="提交">
    		
    对servlet限制
    	1.request.getParameter()方法不能再使用	
        	即使用了也获取的是null
    	2.request.getInputStream()来获取所有消息体数据
    	
    使用第三方工具类,来解析请求体中的文件的数据
    	1.导入jar包
        	commons-fileupload.jar
        	commons-io.jar
    	2.创建解析器工厂
    		new DiskFileItemFactory();
    	3.获取解析器
    		new ServletFileUpload(diskFileItemFactory);
    	4.解析request对象 返回List<FileItem> (表单项对象集合)
        	servletFileUpload.parseRequest(request);
        5.遍历集合 获取每一个表单项 获取数据
        	for(FileItem fileItem : list)
        	判断是否是普通表单项
        	boolean b = fileItem.isFormField();
        	获取表单项name名称
        	fileItem.getFieldName();
                true 表示普通表单项
                	if("username".equals(fieldName))
                	 	获取表单项的值
                		String name = fileItem.getString();
                false 表示文件表单项
                    getName();获取文件名
                    getSize();获取文件大小 单位字节
                    getContentType();获取文件类型
                    将文件写入硬盘
                    这个upload文件夹一开始判断一下,如果不存在,要用代码创建出来
                    File dir = new File(this.getServletContext().getRealPath("/upload"));
                    File file = new File(dir,name);
                    fileItem.write(file);
    
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    快速入门

    @WebServlet(value = "/fileUpload", name = "FileUploadServlet")
    public class FileUploadServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                //创建解析器工厂
                DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
                //获取解析器
                ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
                //解析request对象,返回 List (表单项对象集合)
                //FileItem 表单项对象
                List<FileItem> list = servletFileUpload.parseRequest(request);
    
                //用户的账号密码
                String uname = null;
                String upwd = null;
                //遍历集合,获取每一个表单项,获取数据
                for (FileItem fileItem : list) {
                    boolean formField = fileItem.isFormField();
                    //获取表单项的名称
                    String fieldName = fileItem.getFieldName(); //
                    if (formField) {
                        //true 表示普通的表单项
                        if ("username".equals(fieldName)) {
                            //获取普通表单项的值
                            uname = fileItem.getString("utf-8");
                            System.out.println(uname);
                        }
                        if ("password".equals(fieldName)) {
                            upwd = fileItem.getString("utf-8");
                            System.out.println(upwd);
                        }
    
                    } else {
                        //表示的是文件表单项
                        String fileName = fileItem.getName(); //获取文件名
                        //为了防止文件覆盖,可以随机文件名
                        fileName = System.currentTimeMillis() + "-" + fileName;
                        long size = fileItem.getSize(); //获取文件大小,单位字节
                        String contentType = fileItem.getContentType();
                        //将文件写入硬盘上 这个uploadPhoto文件夹一开始判断一下,如果不存在,要用代码创建出来
                        File dir = new File(this.getServletContext().getRealPath("/uploadPhoto"));
                        if (!dir.exists()) {
                            dir.mkdirs();
                        }
    
                        File file = new File(dir, fileName);
                        //保存文件
                        fileItem.write(file);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    异步文件上传

    AjaxUpload.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
    
    <html>
    <head>
        <title>登录title>
        <script src="js/jquery.js">script>
    head>
    <body>
    <form id="addForm" action="${pageContext.request.contextPath}/login" method="post" enctype="multipart/form-data">
        <input type="text" name="username" value="jack" />
        <input type="password" name="password" value="123456" />
        <input type="file" id="myPhoto" name="avatar" />
        <input type="submit" value="确认">
    form>
    
    body>
    <%--异步上传文件--%>
    <script>
        //给确认按钮设置点击事件
        $("#myPhoto").blur(function () {
            //获取表单的数据
            var data = new FormData($("#addForm")[0]);
            //异步上传文件
            $.ajax({
                type: 'post',
                url: '${pageContext.request.contextPath}/fileUpload',
                cache: false,    //上传文件不需缓存
                processData: false, //需设置为false。因为data值是FormData对象,不需要对数据做处理
                contentType: false, //需设置为false。因为是FormData对象,且已经声明了属性enctype="multipart/form-data"
                data: data,
                dataType: 'json',
                success: function (data) {
                    alert(data.msg);
                },
                error: function () {
                    alert("请求失败");
                }
            })
        })
    script>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    FileUploadServlet.java

    @WebServlet(value = "/fileUpload", name = "FileUploadServlet")
    public class FileUploadServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            try {
                //创建解析器工厂
                DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
                //获取解析器
                ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
                //解析request对象,返回 List (表单项对象集合)
                //FileItem 表单项对象
                List<FileItem> list = servletFileUpload.parseRequest(request);
    
                //用户的账号密码
                String uname = null;
                String upwd = null;
                //遍历集合,获取每一个表单项,获取数据
                for (FileItem fileItem : list) {
                    boolean formField = fileItem.isFormField();
                    //获取表单项的名称
                    String fieldName = fileItem.getFieldName(); //
                    if (formField) {
                        //true 表示普通的表单项
                        if ("username".equals(fieldName)) {
                            //获取普通表单项的值
                            uname = fileItem.getString("utf-8");
                            System.out.println(uname);
                        }
                        if ("password".equals(fieldName)) {
                            upwd = fileItem.getString("utf-8");
                            System.out.println(upwd);
                        }
    
                    } else {
                        //表示的是文件表单项
                        String fileName = fileItem.getName(); //获取文件名
                        //为了防止文件覆盖,可以随机文件名
                        fileName = System.currentTimeMillis() + "-" + fileName;
                        long size = fileItem.getSize(); //获取文件大小,单位字节
                        String contentType = fileItem.getContentType();
                        //将文件写入硬盘上 这个upload文件夹一开始判断一下,如果不存在,要用代码创建出来
                        File dir = new File(this.getServletContext().getRealPath("/uploadPhoto"));
                        if (!dir.exists()) {
                            dir.mkdirs();
                        }
    
                        File file = new File(dir, fileName);
                        //保存文件
                        fileItem.write(file);
    
                        response.setContentType("text/json;charset=utf-8");
                        //{"msg":"上传成功","filename":"name"}
                        response.getWriter().write("{\"msg\":\"上传成功\",\"filename\":\" " + fileName + " \"}");
    
                        request.getSession().setAttribute("username", uname);
                        request.getSession().setAttribute("fileName", fileName);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    文件下载

    服务器端保存到客户端
    
    1.超链接直接指向目标资源下载
        如果浏览器可以解析目标文件,则直接在浏览器中打开。
        反之,则弹出下载提示框
        超链接下载
    
    2.通过Servlet实现下载
        a.超链接指向servlet,传递目标资源的标识符
        	图片请求servlet
        b.定义Servlet
        	获取文件名
        	request.getParameter("filename");
        	获取图片在服务器所在位置
        	request.getServletContext().getRealPath("");
        	new FileInputStream(realPath);
            设置响应头
            告诉浏览器 响应消息体数据打开方式 让浏览器打开下载框
    		response.setHeader("content-disposition", "attachment;filename=" + filename);
            response.setHeader("content-type", this.getServletContext().getMimeType(filename));
            响应回去
            CopyUtils.copy(in,response.getOutputStream);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    快速入门

    downLoad.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Titletitle>
    head>
    <body>
        <a href="${pageContext.request.contextPath}/upload/1.jpg">超链接下载a>
        <br>
        <a href="${pageContext.request.contextPath}/download?filename=2.jpg">图片请求servleta>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    DownLoadServlet.java

    @WebServlet(value = "/download", name = "DownLoadServlet")
    public class DownLoadServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取文件名
            String filename = request.getParameter("filename");
    
            ///WEB-INF/img/+filename 要下载的图片在服务器的位置
            String realPath = request.getServletContext().getRealPath("/WEB-INF/img/" + filename);
            FileInputStream in = new FileInputStream(realPath);
    
            //设置响应头
            //告诉浏览器,响应消息体数据打开方式
            response.setHeader("content-disposition", "attachment;filename=" + filename);
            response.setHeader("content-type", this.getServletContext().getMimeType(filename));
    
            //响应回去
            CopyUtils.copy(in, response.getOutputStream());
    
            in.close();
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    全新物联网数据集成 :Flow 可视化编排 & 双向数据桥接
    思维模型 正/反 木桶理论
    通过FNN算法进行特征组合的商品推荐详细教程 有代码+数据
    mybatis 注解查询一对多,一对一
    下一个创业风口你认为是什么?
    【如何学习CAN总线测试】——节点管理测试
    Mac系统Mysql密码重置的问题
    3. 吴恩达深度学习--初始化、正则化、梯度校验
    创建对象在堆区如何分配内存
    在Linux上安装QQ
  • 原文地址:https://blog.csdn.net/m0_51318597/article/details/127427491