• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Servlet实现文件上传的三种方法总结
    POST TIME:2021-10-18 07:29

    Servlet实现文件上传的三种方法总结

    1. 通过getInputStream()取得上传文件。

    /** 
     * To change this template, choose Tools | Templates 
     * and open the template in the editor. 
     */ 
    package net.individuals.web.servlet; 
     
    import java.io.DataInputStream; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import javax.servlet.ServletException; 
    import javax.servlet.annotation.WebServlet; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
     
    /** 
     * 
     * @author Barudisshu 
     */ 
    @WebServlet(name = "UploadServlet", urlPatterns = {"/UploadServlet"}) 
    public class UploadServlet extends HttpServlet { 
     
      /** 
       * Processes requests for both HTTP 
       * code>GET/code> and 
       * code>POST/code> methods. 
       * 
       * @param request servlet request 
       * @param response servlet response 
       * @throws ServletException if a servlet-specific error occurs 
       * @throws IOException if an I/O error occurs 
       */ 
      protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
          throws ServletException, IOException { 
        response.setContentType("text/html;charset=UTF-8"); 
        //读取请求Body 
        byte[] body = readBody(request); 
        //取得所有Body内容的字符串表示 
        String textBody = new String(body, "ISO-8859-1"); 
        //取得上传的文件名称 
        String fileName = getFileName(textBody); 
        //取得文件开始与结束位置 
        Position p = getFilePosition(request, textBody); 
        //输出至文件 
        writeTo(fileName, body, p); 
      } 
     
      //构造类 
      class Position { 
     
        int begin; 
        int end; 
     
        public Position(int begin, int end) { 
          this.begin = begin; 
          this.end = end; 
        } 
      } 
     
      private byte[] readBody(HttpServletRequest request) throws IOException { 
        //获取请求文本字节长度 
        int formDataLength = request.getContentLength(); 
        //取得ServletInputStream输入流对象 
        DataInputStream dataStream = new DataInputStream(request.getInputStream()); 
        byte body[] = new byte[formDataLength]; 
        int totalBytes = 0; 
        while (totalBytes  formDataLength) { 
          int bytes = dataStream.read(body, totalBytes, formDataLength); 
          totalBytes += bytes; 
        } 
        return body; 
      } 
     
      private Position getFilePosition(HttpServletRequest request, String textBody) throws IOException { 
        //取得文件区段边界信息 
        String contentType = request.getContentType(); 
        String boundaryText = contentType.substring(contentType.lastIndexOf("=") + 1, contentType.length()); 
        //取得实际上传文件的气势与结束位置 
        int pos = textBody.indexOf("filename=\""); 
        pos = textBody.indexOf("\n", pos) + 1; 
        pos = textBody.indexOf("\n", pos) + 1; 
        pos = textBody.indexOf("\n", pos) + 1; 
        int boundaryLoc = textBody.indexOf(boundaryText, pos) - 4; 
        int begin = ((textBody.substring(0, pos)).getBytes("ISO-8859-1")).length; 
        int end = ((textBody.substring(0, boundaryLoc)).getBytes("ISO-8859-1")).length; 
     
        return new Position(begin, end); 
      } 
     
      private String getFileName(String requestBody) { 
        String fileName = requestBody.substring(requestBody.indexOf("filename=\"") + 10); 
        fileName = fileName.substring(0, fileName.indexOf("\n")); 
        fileName = fileName.substring(fileName.indexOf("\n") + 1, fileName.indexOf("\"")); 
     
        return fileName; 
      } 
     
      private void writeTo(String fileName, byte[] body, Position p) throws IOException { 
        FileOutputStream fileOutputStream = new FileOutputStream("e:/workspace/" + fileName); 
        fileOutputStream.write(body, p.begin, (p.end - p.begin)); 
        fileOutputStream.flush(); 
        fileOutputStream.close(); 
      } 
     
      // editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> 
      /** 
       * Handles the HTTP 
       * code>GET/code> method. 
       * 
       * @param request servlet request 
       * @param response servlet response 
       * @throws ServletException if a servlet-specific error occurs 
       * @throws IOException if an I/O error occurs 
       */ 
      @Override 
      protected void doGet(HttpServletRequest request, HttpServletResponse response) 
          throws ServletException, IOException { 
        processRequest(request, response); 
      } 
     
      /** 
       * Handles the HTTP 
       * code>POST/code> method. 
       * 
       * @param request servlet request 
       * @param response servlet response 
       * @throws ServletException if a servlet-specific error occurs 
       * @throws IOException if an I/O error occurs 
       */ 
      @Override 
      protected void doPost(HttpServletRequest request, HttpServletResponse response) 
          throws ServletException, IOException { 
        processRequest(request, response); 
      } 
     
      /** 
       * Returns a short description of the servlet. 
       * 
       * @return a String containing servlet description 
       */ 
      @Override 
      public String getServletInfo() { 
        return "Short description"; 
      }// /editor-fold> 
    } 
    

     2. 通过getPart()、getParts()取得上传文件。

        body格式:

    POST http://www.example.com HTTP/1.1  
    Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA  
     
    ------WebKitFormBoundaryrGKCBY7qhFd3TrwA  
    Content-Disposition: form-data; name="text"  
     
    title  
    ------WebKitFormBoundaryrGKCBY7qhFd3TrwA  
    Content-Disposition: form-data; name="file"; filename="chrome.png"  
    Content-Type: image/png  
     
    PNG ... content of chrome.png ...  
    ------WebKitFormBoundaryrGKCBY7qhFd3TrwA--  
    
     
    
    [html] view plain copy
    /** 
     * To change this template, choose Tools | Templates 
     * and open the template in the editor. 
     */ 
    package net.individuals.web.servlet; 
     
    import java.io.FileNotFoundException; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.OutputStream; 
    import javax.servlet.ServletException; 
    import javax.servlet.annotation.MultipartConfig; 
    import javax.servlet.annotation.WebServlet; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
    import javax.servlet.http.Part; 
     
    /** 
     * 
     * @author Barudisshu 
     */ 
    @MultipartConfig 
    @WebServlet(name = "UploadServlet", urlPatterns = {"/UploadServlet"}) 
    public class UploadServlet extends HttpServlet { 
     
      /** 
       * Processes requests for both HTTP 
       * code>GET/code> and 
       * code>POST/code> methods. 
       * 
       * @param request servlet request 
       * @param response servlet response 
       * @throws ServletException if a servlet-specific error occurs 
       * @throws IOException if an I/O error occurs 
       */ 
      protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
          throws ServletException, IOException { 
        Part part = request.getPart("photo"); 
        String fileName = getFileName(part); 
        writeTo(fileName, part); 
      } 
     
      //取得上传文件名 
      private String getFileName(Part part) { 
        String header = part.getHeader("Content-Disposition"); 
        String fileName = header.substring(header.indexOf("filename=\"") + 10, header.lastIndexOf("\"")); 
     
        return fileName; 
      } 
     
      //存储文件 
      private void writeTo(String fileName, Part part) throws IOException, FileNotFoundException { 
        InputStream in = part.getInputStream(); 
        OutputStream out = new FileOutputStream("e:/workspace/" + fileName); 
        byte[] buffer = new byte[1024]; 
        int length = -1; 
        while ((length = in.read(buffer)) != -1) { 
          out.write(buffer, 0, length); 
        } 
     
        in.close(); 
        out.close(); 
      } 
     
      // editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> 
      /** 
       * Handles the HTTP 
       * code>GET/code> method. 
       * 
       * @param request servlet request 
       * @param response servlet response 
       * @throws ServletException if a servlet-specific error occurs 
       * @throws IOException if an I/O error occurs 
       */ 
      @Override 
      protected void doGet(HttpServletRequest request, HttpServletResponse response) 
          throws ServletException, IOException { 
        processRequest(request, response); 
      } 
     
      /** 
       * Handles the HTTP 
       * code>POST/code> method. 
       * 
       * @param request servlet request 
       * @param response servlet response 
       * @throws ServletException if a servlet-specific error occurs 
       * @throws IOException if an I/O error occurs 
       */ 
      @Override 
      protected void doPost(HttpServletRequest request, HttpServletResponse response) 
          throws ServletException, IOException { 
        processRequest(request, response); 
      } 
     
      /** 
       * Returns a short description of the servlet. 
       * 
       * @return a String containing servlet description 
       */ 
      @Override 
      public String getServletInfo() { 
        return "Short description"; 
      } 
    } 
    
    

    3、另一种较为简单的方法:采用part的wirte(String fileName)上传,浏览器将产生临时TMP文件

    /** 
     * To change this template, choose Tools | Templates 
     * and open the template in the editor. 
     */ 
    package net.individuals.web.servlet; 
     
    import java.io.IOException; 
    import java.io.PrintWriter; 
    import javax.servlet.ServletException; 
    import javax.servlet.annotation.MultipartConfig; 
    import javax.servlet.annotation.WebServlet; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
    import javax.servlet.http.Part; 
     
    /** 
     *采用part的wirte(String fileName)上传,浏览器将产生临时TMP文件。 
     * @author Barudisshu 
     */ 
    @MultipartConfig(location = "e:/workspace") 
    @WebServlet(name = "UploadServlet", urlPatterns = {"/UploadServlet"}) 
    public class UploadServlet extends HttpServlet { 
     
      /** 
       * Processes requests for both HTTP 
       * code>GET/code> and 
       * code>POST/code> methods. 
       * 
       * @param request servlet request 
       * @param response servlet response 
       * @throws ServletException if a servlet-specific error occurs 
       * @throws IOException if an I/O error occurs 
       */ 
      protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
          throws ServletException, IOException { 
        //处理中文文件名 
        request.setCharacterEncoding("UTF-8"); 
        Part part = request.getPart("photo"); 
        String fileName = getFileName(part); 
        //将文件写入location指定的目录 
        part.write(fileName); 
      } 
     
      private String getFileName(Part part) { 
        String header = part.getHeader("Content-Disposition"); 
        String fileName = header.substring(header.indexOf("filename=\"") + 10, header.lastIndexOf("\"")); 
        return fileName; 
      } 
     
      // editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> 
      /** 
       * Handles the HTTP 
       * code>GET/code> method. 
       * 
       * @param request servlet request 
       * @param response servlet response 
       * @throws ServletException if a servlet-specific error occurs 
       * @throws IOException if an I/O error occurs 
       */ 
      @Override 
      protected void doGet(HttpServletRequest request, HttpServletResponse response) 
          throws ServletException, IOException { 
        processRequest(request, response); 
      } 
     
      /** 
       * Handles the HTTP 
       * code>POST/code> method. 
       * 
       * @param request servlet request 
       * @param response servlet response 
       * @throws ServletException if a servlet-specific error occurs 
       * @throws IOException if an I/O error occurs 
       */ 
      @Override 
      protected void doPost(HttpServletRequest request, HttpServletResponse response) 
          throws ServletException, IOException { 
        processRequest(request, response); 
      } 
     
      /** 
       * Returns a short description of the servlet. 
       * 
       * @return a String containing servlet description 
       */ 
      @Override 
      public String getServletInfo() { 
        return "Short description"; 
      }// /editor-fold> 
    } 
    
    

    以上就是Servlet实现文件上传的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

    您可能感兴趣的文章:
    • Java Servlet简单实例分享(文件上传下载demo)
    • SpringMVC + servlet3.0 文件上传的配置和实现代码
    • Servlet实现多文件上传功能
    • Servlet3.0实现文件上传的方法
    • servlet+jquery实现文件上传进度条示例代码
    • Servlet实现文件上传,可多文件上传示例
    • java基于servlet使用组件smartUpload实现文件上传
    • java基于servlet实现文件上传功能解析
    • servlet+JSP+mysql实现文件上传的方法
    • Android中发送Http请求(包括文件上传、servlet接收)的实例代码
    上一篇:JSP 开发之Spring BeanUtils组件使用
    下一篇:Jsp+Servlet实现购物车功能
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信