Servlet实现文件的上传

Servlet实现文件的上传

  1. 导入文件上传需要的jar包(maven实现,不包括serlvet的jar包)

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>
    
  2. 实现jsp显示

    <form action="/test/ul" enctype="multipart/form-data" method="post">
        学号<input type="text" name="sno"><br/>
        姓名<input type="text" name="name"><br/>
        上传<input type="file" name="f">
        <input type="submit" value="提交">
    </form>
    
    • enctype=“multipart/form-data” 上传文件时需要设置

      [外链图片转存失败(img-Vf0KiRGx-1565777958520)(C:\Users\53495\AppData\Roaming\Typora\typora-user-images\1552460483839.png)]

    • method属性必须设置为post

    • input type属性需要设置为file

  3. 编写Servlet

    1. 创建UpLoad类继承HttpServlet类并且实现doPost方法

    2. 设置请求响应字符集

      req.setCharacterEncoding("utf-8");
      resp.setContentType("text/html");
      resp.setCharacterEncoding("utf-8"); 
      
    3. 实现上传代码

      1. 通过boolean isMultipart = ServletFileUpLoad.isMultipartContent(req);判断是否时上传文件的表单

      2. 创建FileItemFactory工厂对象

        FileItemFcatory factory = new DiskFileItemFactory();

      3. 创建ServletFileUpLoad对象

        ServletFileUpLoad upload = new ServletUpLoad(factory);

      4. 通过List取出表单信息

        List items = upload.parseRequest(req);

      5. 使用Iterator迭代遍历List

        Iterator iter = items.iterator();

        while(iter.hasNext()){

        1. 通过iter获取FileItem对象

          FileItem item = iter.next();

        2. 通过item.isFormField判断是否为表单非文件type

          if(item.isFormField){

          1. type非file的input 取出input 的name 通过item.getFieldName()

            String fieldName = item.getFieldName();

          2. 通过input的name 确认表单的信息并获取

            if(fieldName.equals(“对应的表单名”))

            ​ String value = item.getString(“字符集编码”);

          }else{

          1. 获取文件名字

            String fileName = item.getName();

          2. 设置存储路径

            File file = new File(“路径”,fileName);

          3. 上传到设置的存储路径

            item.write(file);

          }

        }

      package updown;
      
      import org.apache.commons.fileupload.FileItem;
      import org.apache.commons.fileupload.FileItemFactory;
      import org.apache.commons.fileupload.FileUploadException;
      import org.apache.commons.fileupload.disk.DiskFileItemFactory;
      import org.apache.commons.fileupload.servlet.ServletFileUpload;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.File;
      import java.io.IOException;
      import java.io.PrintWriter;
      import java.util.Iterator;
      import java.util.List;
      
      @WebServlet("/ul")
      public class UpLoad extends HttpServlet {
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              req.setCharacterEncoding("utf-8");
              resp.setContentType("text/html");
              resp.setCharacterEncoding("utf-8");
              PrintWriter out = resp.getWriter();
              try {
                  boolean ismulipart = ServletFileUpload.isMultipartContent(req);
                  if(ismulipart){
                      FileItemFactory factory = new DiskFileItemFactory();
                      ServletFileUpload upload = new ServletFileUpload(factory);
                      List<FileItem> items = upload.parseRequest(req);
                      Iterator<FileItem> iter = items.iterator();
                      while(iter.hasNext()){
                          FileItem item = iter.next();
                          if(item.isFormField()){
                              String formName = item.getFieldName();
                              if(formName.equals("sno")){
                                  out.println(item.getString("utf-8"));
                              }else if(formName.equals("name")){
                                  out.println(item.getString("utf-8"));
                              }
                          }else{
                              //out.println("上传");
                              String name = item.getName();
                              out.println(name);
                              //out.println("上传1");
                              File file = new 		File("D:\\Study_WorkPlace\\upload",name);
                              //println("上传2");
                              item.write(file);
                              //out.println("上传3");
                              out.println("上传成功");
                          }
                      }
      
                  }
              } catch (FileUploadException e) {
                  e.printStackTrace();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
      
    4. 特别说明

      1. 因为ServletUpLoad构造参数需要FileItemFactoty对象所以首先需要创建此工厂

      2. 获取的单个信息都存在 FileItem对象中 ,通过ServletUpLoad的parseRequest(req)方法获得所有信息存储在集合List

      3. 在实现上传的代码中item存储的是需要上传的文件的所有信息file文件则是确认文件上传的位置和名字,然后通过**.write()**来实现上传

      4. 部分浏览器过去文件名字带真实路径,上述方法只适用于上传名字仅为名字的情况

      5. 名字为真实路径的方法 已解决

        package updown;
        
        import org.apache.commons.fileupload.FileItem;
        import org.apache.commons.fileupload.FileItemFactory;
        import org.apache.commons.fileupload.FileUploadException;
        import org.apache.commons.fileupload.disk.DiskFileItemFactory;
        import org.apache.commons.fileupload.servlet.ServletFileUpload;
        
        import javax.servlet.ServletException;
        import javax.servlet.annotation.WebServlet;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import java.io.File;
        import java.io.IOException;
        import java.io.PrintWriter;
        import java.util.Iterator;
        import java.util.List;
        
        @WebServlet("/ul")
        public class UpLoad extends HttpServlet {
            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                req.setCharacterEncoding("utf-8");
                resp.setContentType("text/html");
                resp.setCharacterEncoding("utf-8");
                PrintWriter out = resp.getWriter();
                try {
                    boolean ismulipart = ServletFileUpload.isMultipartContent(req);
                    if(ismulipart){
                        FileItemFactory factory = new DiskFileItemFactory();
                        ServletFileUpload upload = new ServletFileUpload(factory);
                        List<FileItem> items = upload.parseRequest(req);
                        Iterator<FileItem> iter = items.iterator();
                        while(iter.hasNext()){
                            FileItem item = iter.next();
                            if(item.isFormField()){
                                String formName = item.getFieldName();
                                if(formName.equals("sno")){
                                    out.println(item.getString("utf-8"));
                                }else if(formName.equals("name")){
                                    out.println(item.getString("utf-8"));
                                }
                            }else{
                                //out.println("上传");
                                String temp = item.getName();
                                String[] split = temp.split("\\\\");
                                String name = split[split.length-1];
                                out.println(split);
                                //out.println("上传1");
                                File file = new File("D:\\Study_WorkPlace\\upload",name);
                                //println("上传2");
                                item.write(file);
                                //out.println("上传3");
                                out.println("上传成功");
                            }
                        }
        
                    }
                } catch (FileUploadException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
                    }
                } catch (FileUploadException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值