博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet多文件上传方法
阅读量:5816 次
发布时间:2019-06-18

本文共 14963 字,大约阅读时间需要 49 分钟。

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

001 /**
002  * To change this template, choose Tools | Templates
003  * and open the template in the editor.
004  */
005 package net.individuals.web.servlet;
006   
007 import java.io.DataInputStream;
008 import java.io.FileOutputStream;
009 import java.io.IOException;
010 import javax.servlet.ServletException;
011 import javax.servlet.annotation.WebServlet;
012 import javax.servlet.http.HttpServlet;
013 import javax.servlet.http.HttpServletRequest;
014 import javax.servlet.http.HttpServletResponse;
015   
016 /**
017  *
018  * @author Barudisshu
019  */
020 @WebServlet(name = "UploadServlet", urlPatterns = {
"/UploadServlet"})
021 public class UploadServlet extends HttpServlet {
022   
023     /**
024      * Processes requests for both HTTP
025      * <code>GET</code> and
026      * <code>POST</code> methods.
027      *
028      * @param request servlet request
029      * @param response servlet response
030      * @throws ServletException if a servlet-specific error occurs
031      * @throws IOException if an I/O error occurs
032      */
033     protected void processRequest(HttpServletRequest request, HttpServletResponse response)
034             throws ServletException, IOException {
035         response.setContentType("text/html;charset=UTF-8");
036         //读取请求Body
037         byte[] body = readBody(request);
038         //取得所有Body内容的字符串表示
039         String textBody = new String(body, "ISO-8859-1");
040         //取得上传的文件名称
041         String fileName = getFileName(textBody);
042         //取得文件开始与结束位置
043         Position p = getFilePosition(request, textBody);
044         //输出至文件
045         writeTo(fileName, body, p);
046     }
047   
048     //构造类
049     class Position {
050   
051         int begin;
052         int end;
053   
054         public Position(int begin, int end) {
055             this.begin = begin;
056             this.end = end;
057         }
058     }
059   
060     private byte[] readBody(HttpServletRequest request) throws IOException {
061         //获取请求文本字节长度
062         int formDataLength = request.getContentLength();
063         //取得ServletInputStream输入流对象
064         DataInputStream dataStream = new DataInputStream(request.getInputStream());
065         byte body[] = new byte[formDataLength];
066         int totalBytes = 0;
067         while (totalBytes < formDataLength) {
068             int bytes = dataStream.read(body, totalBytes, formDataLength);
069             totalBytes += bytes;
070         }
071         return body;
072     }
073   
074     private Position getFilePosition(HttpServletRequest request, String textBody) throws IOException {
075         //取得文件区段边界信息
076         String contentType = request.getContentType();
077         String boundaryText = contentType.substring(contentType.lastIndexOf("=") + 1, contentType.length());
078         //取得实际上传文件的气势与结束位置
079         int pos = textBody.indexOf("filename=\"");
080         pos = textBody.indexOf("\n", pos) + 1;
081         pos = textBody.indexOf("\n", pos) + 1;
082         pos = textBody.indexOf("\n", pos) + 1;
083         int boundaryLoc = textBody.indexOf(boundaryText, pos) - 4;
084         int begin = ((textBody.substring(0, pos)).getBytes("ISO-8859-1")).length;
085         int end = ((textBody.substring(0, boundaryLoc)).getBytes("ISO-8859-1")).length;
086   
087         return new Position(begin, end);
088     }
089   
090     private String getFileName(String requestBody) {
091         String fileName = requestBody.substring(requestBody.indexOf("filename=\"") + 10);
092         fileName = fileName.substring(0, fileName.indexOf("\n"));
093         fileName = fileName.substring(fileName.indexOf("\n") + 1, fileName.indexOf("\""));
094   
095         return fileName;
096     }
097   
098     private void writeTo(String fileName, byte[] body, Position p) throws IOException {
099         FileOutputStream fileOutputStream = new FileOutputStream("e:/workspace/" + fileName);
100         fileOutputStream.write(body, p.begin, (p.end - p.begin));
101         fileOutputStream.flush();
102         fileOutputStream.close();
103     }
104   
105     // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
106     /**
107      * Handles the HTTP
108      * <code>GET</code> method.
109      *
110      * @param request servlet request
111      * @param response servlet response
112      * @throws ServletException if a servlet-specific error occurs
113      * @throws IOException if an I/O error occurs
114      */
115     @Override
116     protected void doGet(HttpServletRequest request, HttpServletResponse response)
117             throws ServletException, IOException {
118         processRequest(request, response);
119     }
120   
121     /**
122      * Handles the HTTP
123      * <code>POST</code> method.
124      *
125      * @param request servlet request
126      * @param response servlet response
127      * @throws ServletException if a servlet-specific error occurs
128      * @throws IOException if an I/O error occurs
129      */
130     @Override
131     protected void doPost(HttpServletRequest request, HttpServletResponse response)
132             throws ServletException, IOException {
133         processRequest(request, response);
134     }
135   
136     /**
137      * Returns a short description of the servlet.
138      *
139      * @return a String containing servlet description
140      */
141     @Override
142     public String getServletInfo() {
143         return "Short description";
144     }// </editor-fold>
145 }

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

 

001 /**
002  * To change this template, choose Tools | Templates
003  * and open the template in the editor.
004  */
005 package net.individuals.web.servlet;
006   
007 import java.io.FileNotFoundException;
008 import java.io.FileOutputStream;
009 import java.io.IOException;
010 import java.io.InputStream;
011 import java.io.OutputStream;
012 import javax.servlet.ServletException;
013 import javax.servlet.annotation.MultipartConfig;
014 import javax.servlet.annotation.WebServlet;
015 import javax.servlet.http.HttpServlet;
016 import javax.servlet.http.HttpServletRequest;
017 import javax.servlet.http.HttpServletResponse;
018 import javax.servlet.http.Part;
019   
020 /**
021  *
022  * @author Barudisshu
023  */
024 @MultipartConfig
025 @WebServlet(name = "UploadServlet", urlPatterns = {
"/UploadServlet"})
026 public class UploadServlet extends HttpServlet {
027   
028     /**
029      * Processes requests for both HTTP
030      * <code>GET</code> and
031      * <code>POST</code> methods.
032      *
033      * @param request servlet request
034      * @param response servlet response
035      * @throws ServletException if a servlet-specific error occurs
036      * @throws IOException if an I/O error occurs
037      */
038     protected void processRequest(HttpServletRequest request, HttpServletResponse response)
039             throws ServletException, IOException {
040         Part part = request.getPart("photo");
041         String fileName = getFileName(part);
042         writeTo(fileName, part);
043     }
044   
045     //取得上传文件名
046     private String getFileName(Part part) {
047         String header = part.getHeader("Content-Disposition");
048         String fileName = header.substring(header.indexOf("filename=\"") + 10, header.lastIndexOf("\""));
049   
050         return fileName;
051     }
052   
053     //存储文件
054     private void writeTo(String fileName, Part part) throws IOException, FileNotFoundException {
055         InputStream in = part.getInputStream();
056         OutputStream out = new FileOutputStream("e:/workspace/" + fileName);
057         byte[] buffer = new byte[1024];
058         int length = -1;
059         while ((length = in.read(buffer)) != -1) {
060             out.write(buffer, 0, length);
061         }
062   
063         in.close();
064         out.close();
065     }
066   
067     // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
068     /**
069      * Handles the HTTP
070      * <code>GET</code> method.
071      *
072      * @param request servlet request
073      * @param response servlet response
074      * @throws ServletException if a servlet-specific error occurs
075      * @throws IOException if an I/O error occurs
076      */
077     @Override
078     protected void doGet(HttpServletRequest request, HttpServletResponse response)
079             throws ServletException, IOException {
080         processRequest(request, response);
081     }
082   
083     /**
084      * Handles the HTTP
085      * <code>POST</code> method.
086      *
087      * @param request servlet request
088      * @param response servlet response
089      * @throws ServletException if a servlet-specific error occurs
090      * @throws IOException if an I/O error occurs
091      */
092     @Override
093     protected void doPost(HttpServletRequest request, HttpServletResponse response)
094             throws ServletException, IOException {
095         processRequest(request, response);
096     }
097   
098     /**
099      * Returns a short description of the servlet.
100      *
101      * @return a String containing servlet description
102      */
103     @Override
104     public String getServletInfo() {
105         return "Short description";
106     }// </editor-fold>
107 }

另一种较为简单的方法:

01 /**
02  * To change this template, choose Tools | Templates
03  * and open the template in the editor.
04  */
05 package net.individuals.web.servlet;
06   
07 import java.io.IOException;
08 import java.io.PrintWriter;
09 import javax.servlet.ServletException;
10 import javax.servlet.annotation.MultipartConfig;
11 import javax.servlet.annotation.WebServlet;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15 import javax.servlet.http.Part;
16   
17 /**
18  *采用part的wirte(String fileName)上传,浏览器将产生临时TMP文件。
19  * @author Barudisshu
20  */
21 @MultipartConfig(location = "e:/workspace")
22 @WebServlet(name = "UploadServlet", urlPatterns = {
"/UploadServlet"})
23 public class UploadServlet extends HttpServlet {
24   
25     /**
26      * Processes requests for both HTTP
27      * <code>GET</code> and
28      * <code>POST</code> methods.
29      *
30      * @param request servlet request
31      * @param response servlet response
32      * @throws ServletException if a servlet-specific error occurs
33      * @throws IOException if an I/O error occurs
34      */
35     protected void processRequest(HttpServletRequest request, HttpServletResponse response)
36             throws ServletException, IOException {
37         //处理中文文件名
38         request.setCharacterEncoding("UTF-8");
39         Part part = request.getPart("photo");
40         String fileName = getFileName(part);
41         //将文件写入location指定的目录
42         part.write(fileName);
43     }
44   
45     private String getFileName(Part part) {
46         String header = part.getHeader("Content-Disposition");
47         String fileName = header.substring(header.indexOf("filename=\"") + 10, header.lastIndexOf("\""));
48         return fileName;
49     }
50   
51     // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
52     /**
53      * Handles the HTTP
54      * <code>GET</code> method.
55      *
56      * @param request servlet request
57      * @param response servlet response
58      * @throws ServletException if a servlet-specific error occurs
59      * @throws IOException if an I/O error occurs
60      */
61     @Override
62     protected void doGet(HttpServletRequest request, HttpServletResponse response)
63             throws ServletException, IOException {
64         processRequest(request, response);
65     }
66   
67     /**
68      * Handles the HTTP
69      * <code>POST</code> method.
70      *
71      * @param request servlet request
72      * @param response servlet response
73      * @throws ServletException if a servlet-specific error occurs
74      * @throws IOException if an I/O error occurs
75      */
76     @Override
77     protected void doPost(HttpServletRequest request, HttpServletResponse response)
78             throws ServletException, IOException {
79         processRequest(request, response);
80     }
81   
82     /**
83      * Returns a short description of the servlet.
84      *
85      * @return a String containing servlet description
86      */
87     @Override
88     public String getServletInfo() {
89         return "Short description";
90     }// </editor-fold>
91 }

使用getParts()上传多个文件:

 

 
01 <!--
02 To change this template, choose Tools | Templates
03 and open the template in the editor.
04 -->
05 <!DOCTYPE html>
06 <html>
07     <head>
08         <title></title>
09         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
10     </head>
11     <body>
12         <div>
13             <form action="UploadServlet3" method="POST" enctype="multipart/form-data">
14                 <table>
15                     <tr>
16                         <td><label for="file1">文件1:</label></td>
17                         <td><input type="file" id="file1" name="file"></td>
18                     </tr>
19                     <tr>
20                         <td><label for="file2">文件2:</label></td>
21                         <td><input type="file" id="file2" name="file"></td>
22                     </tr>
23                     <tr>
24                         <td><label for="file3">文件3:</label></td>
25                         <td><input type="file" id="file3" name="file"></td>
26                     </tr>
27                     <tr>
28                         <td colspan="2"><input type="submit" value="上传" name="upload"></td>
29                     </tr>
30                 </table>
31             </form>
32         </div>
33     </body>
34 </html>

 

 

对应Servlet代码:

01 /**
02  * To change this template, choose Tools | Templates
03  * and open the template in the editor.
04  */
05 package net.individuals.web.servlet;
06   
07 import java.io.IOException;
08 import java.io.PrintWriter;
09 import javax.servlet.ServletException;
10 import javax.servlet.annotation.MultipartConfig;
11 import javax.servlet.annotation.WebServlet;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15 import javax.servlet.http.Part;
16   
17 /**
18  *
19  * @author Barudisshu
20  */
21 @MultipartConfig(location = "e:/workspace")
22 @WebServlet(name = "UploadServlet", urlPatterns = {
"/UploadServlet"})
23 public class UploadServlet extends HttpServlet {
24   
25     /**
26      * Processes requests for both HTTP
27      * <code>GET</code> and
28      * <code>POST</code> methods.
29      *
30      * @param request servlet request
31      * @param response servlet response
32      * @throws ServletException if a servlet-specific error occurs
33      * @throws IOException if an I/O error occurs
34      */
35     protected void processRequest(HttpServletRequest request, HttpServletResponse response)
36             throws ServletException, IOException {
37         request.setCharacterEncoding("utf-8");
38         //迭代Collection中所有Part对象
39         for (Part part : request.getParts()) {
40             //只处理上传文件区段
41             if (part.getName().startsWith("file")) {
42                 String fileName = getFileName(part);
43                 part.write(fileName);
44             }
45         }
46     }
47   
48     private String getFileName(Part part) {
49         String header = part.getHeader("Content-Disposition");
50         String fileName = header.substring(header.indexOf("filename=\"") + 10, header.lastIndexOf("\""));
51         header.lastIndexOf("\"");
52         return fileName;
53     }
54   
55     // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
56     /**
57      * Handles the HTTP
58      * <code>GET</code> method.
59      *
60      * @param request servlet request
61      * @param response servlet response
62      * @throws ServletException if a servlet-specific error occurs
63      * @throws IOException if an I/O error occurs
64      */
65     @Override
66     protected void doGet(HttpServletRequest request, HttpServletResponse response)
67             throws ServletException, IOException {
68         processRequest(request, response);
69     }
70   
71     /**
72      * Handles the HTTP
73      * <code>POST</code> method.
74      *
75      * @param request servlet request
76      * @param response servlet response
77      * @throws ServletException if a servlet-specific error occurs
78      * @throws IOException if an I/O error occurs
79      */
80     @Override
81     protected void doPost(HttpServletRequest request, HttpServletResponse response)
82             throws ServletException, IOException {
83         processRequest(request, response);
84     }
85   
86     /**
87      * Returns a short description of the servlet.
88      *
89      * @return a String containing servlet description
90      */
91     @Override
92     public String getServletInfo() {
93         return "Short description";
94     }// </editor-fold>
95 }

转载地址:http://bymbx.baihongyu.com/

你可能感兴趣的文章
Dubbo笔记(四)
查看>>
Web前端JQuery入门实战案例
查看>>
java B2B2C Springboot电子商城系统- SSO单点登录之OAuth2.0 登出流程(3)
查看>>
USB 通信原理
查看>>
7zZip zip RAR iOS
查看>>
date命令的详细用法!
查看>>
UiAutomator源码分析之UiAutomatorBridge框架
查看>>
python 开发之selenium
查看>>
Xcode3.2.5中找不到Mac OS X - Command Line Utility -...
查看>>
css的div垂直居中的方法,百分比div垂直居中
查看>>
如何理解EM算法
查看>>
nginx 域名跳转一例~~~(rewrite、proxy)
查看>>
linux用户家目录无损迁移到独立硬盘
查看>>
文件查找
查看>>
shell编程前言(一)
查看>>
5、centos7.*配置yum的EPEL源及其它源
查看>>
JSON前后台简单操作
查看>>
shell中一些常见的文件操作符
查看>>
CentOS 7 装vim遇到的问题和解决方法
查看>>
JavaScript基础教程1-20160612
查看>>