Servlet多文件上传方法

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

001/**
002 * To change this template, choose Tools | Templates
003 * and open the template in the editor.
004 */
005package net.individuals.web.servlet;
006  
007import java.io.DataInputStream;
008import java.io.FileOutputStream;
009import java.io.IOException;
010import javax.servlet.ServletException;
011import javax.servlet.annotation.WebServlet;
012import javax.servlet.http.HttpServlet;
013import javax.servlet.http.HttpServletRequest;
014import javax.servlet.http.HttpServletResponse;
015  
016/**
017 *
018 * @author Barudisshu
019 */
020@WebServlet(name = "UploadServlet", urlPatterns = {"/UploadServlet"})
021public 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 */
005package net.individuals.web.servlet;
006  
007import java.io.FileNotFoundException;
008import java.io.FileOutputStream;
009import java.io.IOException;
010import java.io.InputStream;
011import java.io.OutputStream;
012import javax.servlet.ServletException;
013import javax.servlet.annotation.MultipartConfig;
014import javax.servlet.annotation.WebServlet;
015import javax.servlet.http.HttpServlet;
016import javax.servlet.http.HttpServletRequest;
017import javax.servlet.http.HttpServletResponse;
018import javax.servlet.http.Part;
019  
020/**
021 *
022 * @author Barudisshu
023 */
024@MultipartConfig
025@WebServlet(name = "UploadServlet", urlPatterns = {"/UploadServlet"})
026public 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 */
05package net.individuals.web.servlet;
06  
07import java.io.IOException;
08import java.io.PrintWriter;
09import javax.servlet.ServletException;
10import javax.servlet.annotation.MultipartConfig;
11import javax.servlet.annotation.WebServlet;
12import javax.servlet.http.HttpServlet;
13import javax.servlet.http.HttpServletRequest;
14import javax.servlet.http.HttpServletResponse;
15import 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"})
23public 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<!--
02To change this template, choose Tools | Templates
03and 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 */
05package net.individuals.web.servlet;
06  
07import java.io.IOException;
08import java.io.PrintWriter;
09import javax.servlet.ServletException;
10import javax.servlet.annotation.MultipartConfig;
11import javax.servlet.annotation.WebServlet;
12import javax.servlet.http.HttpServlet;
13import javax.servlet.http.HttpServletRequest;
14import javax.servlet.http.HttpServletResponse;
15import javax.servlet.http.Part;
16  
17/**
18 *
19 * @author Barudisshu
20 */
21@MultipartConfig(location = "e:/workspace")
22@WebServlet(name = "UploadServlet", urlPatterns = {"/UploadServlet"})
23public 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}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值