美文网首页我爱编程
Servlet——upload

Servlet——upload

作者: 嗷老板 | 来源:发表于2018-04-06 21:39 被阅读0次

    一、文件上传的概述

      用户将本地文件通过网络上传至服务器的过程。可以用于图片发送、上传简历等。

    1、文件上传技术

    • jspSmartUpload  应用于jsp上的文件上传和文件下载的组件
    • fileupload     应用在Java上的文件上传技术,由Apache开源组织提供
    • servlet3.0     提供了文件上传的技术
    • Struts       提供了文件上传技术

    2、文件上传的必要因素

    • 需要有一个表单
    • 表单的method属性的值必须设置为post
    • 表单的enctype属性的值需要设置为multipart/form-data
    • 表单需要有一个input标签
        input标签type属性的值需要设置为file
        input属性需要有name属性和值

    3、文件上传的原理分析

    <%@ 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">
    <title>Insert title here</title>
    </head>
    <body>
        <h1>文件上传</h1>
        <form action="" method="post" enctype="multipart/form-data">
        文件信息:<input type="text" name="info"/>
        <br />
        文件:<input type="file" name="file01"/>
        <br />
        <input type="submit" value="上传"/>
        
        
        </form>
    </body>
    </html>
    

    enctype
      这个属性是encode type的缩写,表示编码类型,属性规定了发送服务器之前如何对表单数据进行编码。默认属性为:application/x-www-form-urlencoded。
      application/x-www-form-urlencoded:默认对表单数据进行url编码,不能用于文件上传。
      multipart./form-data:表单数据有多个部分组成,既有文本数据,还有文件、图片这些二进制数据。设置以后,浏览器会将文件以二进制的方式上传,可以实现多种类型的文件上传。

    二、文件上传的案例

      实现文件上传案例需要导入两个jar包,将两个jar包直接复制到WEB-INF目录的lib文件夹下就可以了。jar包下载链接: https://pan.baidu.com/s/1sUpeLYnQKY5Vrkb2AS-NpA 密码: icyh

    <%@ 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">
    <title>Insert title here</title>
    </head>
    <body>
        <h1>文件上传</h1>
        <form action="${pageContext.request.contextPath }/UploadServlet" method="post" enctype="multipart/form-data">
        文件信息:<input type="text" name="info"/>
        <br />
        文件:<input type="file" name="file01"/>
        <br />
        <input type="submit" value="上传"/>
        </form>
    </body>
    </html>
    

    1、获取表单提交的数据

    步骤:
      (1)创建一个磁盘文件的工厂对象
      (2)创建文件上传的核心对象
      (3)通过核心对象解析请求对象得到一个集合对象,它里面包含所有的表单项对象
      (4)遍历这个集合对象,得到每一个表单项,判断他时候是普通表单项
      (5)如果是普通的表单项,获取他的name和value的值

    import java.io.IOException;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    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;
    
    public class UploadServlet extends HttpServlet {
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取表单提交的数据
            //创建磁盘文件的工厂工具
            DiskFileItemFactory dfif = new DiskFileItemFactory();
            //创建文件上传的核心对象
            ServletFileUpload upload = new ServletFileUpload(dfif);
            //解析请求对象,获取对象所提交的数据
            List<FileItem> items = null;
            try {
                items = upload.parseRequest(request);
            } catch (FileUploadException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            //遍历集合对象
            if(items != null){
                for(FileItem fileItem : items){
                    //判断表单是否是普通的表单项
                    if(fileItem.isFormField()){
                        //确认是普通表单项
                        //获取普通表单项的name属性的值
                        String fieldName = fileItem.getFieldName();
                        //获取普通表单项的value属性的值
                        String value = fileItem.getString("UTF-8");
                        System.out.println(fieldName+"="+value);
                    }
                }
            }
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    

    2、获取表单提交文件的案例

      我们在上面一个案例中,对文件类型进行了判断,如果是普通的表单项,就获取表单项的name和value,那么如果是提交文件的表单项,就不能获取这个文件,所以我们要修改UploadServlet,获取表单提交的文件。

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    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;
    
    
    
    
    public class UploadServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取表单提交的数据
            //创建磁盘文件的工厂对象
            DiskFileItemFactory dfif = new DiskFileItemFactory();
            //创建文件上传核心对象
            ServletFileUpload upload = new ServletFileUpload(dfif);
            //解析请求对象,获取表单提交的数据
            List<FileItem> items = null;
            try{
                items = upload.parseRequest(request);
            }catch(FileUploadException e) {
                e.printStackTrace();
            }
            
            //遍历集合对象
            if(items != null){
                for (FileItem fileItem : items) {
                    //判断表单是否是普通的表单项
                    if(fileItem.isFormField()){
                        //确定是普通的表单项
                        //获取普通表单项的name
                        String fieldName = fileItem.getFieldName();
                        //获取普通表单项的value
                        String value = fileItem.getString();
                        System.out.println(fileItem+"---"+value);
                    }else{
                        //文件上传的表单项
                        //获取文件名称
                        String fileName = fileItem.getName();
                        //获取文件的内容
                        //获取输入流对象
                        InputStream is = fileItem.getInputStream();
                        //获取文件输出的路径
                        String realPath = getServletContext().getRealPath("/file");
                        File file = new File(realPath);
                        if(!file.exists()){
                            //目录不存在,则要创建
                            file.mkdirs();
                        }
                        //创建输出流对象
                        OutputStream os = new FileOutputStream(realPath+"/"+fileName);
                        byte[] bys = new byte[1024];
                        int len = 0;
                        while((len = is.read(bys)) != -1){
                            os.write(bys, 0, len);
                        }
                        
                        os.close();
                    }           
                }
            }
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    

    相关文章

      网友评论

        本文标题:Servlet——upload

        本文链接:https://www.haomeiwen.com/subject/bwzqhftx.html