HttpServletRequest#getParts()返回一个空列表

时间:2011-09-16 13:20:31

标签: jsp servlets

我有以下HTML表单:

<form enctype="multipart/form-data" method="post" action="/myservlet">
    <input type="file" name="mptest">
    <br />
    <input type="submit" value="upload">
 </form>

我有以下基于this answer创建的servlet:

package com.functions;

import java.io.*;
// import java.sql.Connection;
// import java.sql.PreparedStatement;
// import java.sql.ResultSet;
// import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

// import com.functions.utility.DBConnector;
public class restore extends HttpServlet {

    private static final long serialVersionUID = 8097085789553030042L;

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        System.out.println("--------------------");
        System.out.println(" On restore.java ");
        System.out.println("--------------------");
        try {
            fetchDataFromDB(request, response);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void fetchDataFromDB(HttpServletRequest request,
            HttpServletResponse response) throws InterruptedException,
            IllegalStateException, ServletException {
        try {
            System.out.println("Test 1");
            for (Part part : request.getParts()) {
                String filename = getFilename(part);
                System.out.println("Test 2");
                if (filename == null) {
                    System.out.println("Test 3");
                    // Process regular form field (input
                    // type="text|radio|checkbox|etc", select, etc).
                    String fieldname = part.getName();
                    System.out.println(fieldname);
                    String fieldvalue = getValue(part);
                    System.out.println(fieldvalue);
                    // ... (do your job here)
                } else if (!filename.isEmpty()) {
                    System.out.println("Test 4");
                    // Process form file field (input type="file").
                    String fieldname = part.getName();
                    System.out.println(fieldname);
                    filename = filename
                            .substring(filename.lastIndexOf('/') + 1)
                            .substring(filename.lastIndexOf('\\') + 1); // MSIE
                                                                        // fix.
                    InputStream filecontent = part.getInputStream();
                    System.out.println(filecontent);
                    String[] command = new String[] {
                            "C:/Program Files (x86)/MySQL/MySQL Server "
                            + "5.5/bin/mysql",
                            "--user=root", "--password=root", "dummy", "-e",
                            "source "+"C:/Users/John/Desktop/LMS/backup.sql" };
                    Process restore = Runtime.getRuntime().exec(command);
                    int check = restore.waitFor();
                    System.out.println(check);
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private static String getFilename(Part part) {
        for (String cd : part.getHeader("content-disposition").split(";")) {
            if (cd.trim().startsWith("filename")) {
                return cd.substring(cd.indexOf('=') + 1).trim()
                        .replace("\"", "");
            }
        }
        return null;
    }

    private static String getValue(Part part) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                part.getInputStream(), "UTF-8"));
        StringBuilder value = new StringBuilder();
        char[] buffer = new char[1024];
        for (int length = 0; (length = reader.read(buffer)) > 0;) {
            value.append(buffer, 0, length);
        }
        return value.toString();
    }
}

但永远不会输入request.getParts()上的for循环。这是怎么造成的,我该如何解决?

1 个答案:

答案 0 :(得分:20)

如果您想使用Servlet 3.0 HttpServletRequest#getParts(),则必须使用@MultipartConfig注释您的servlet。

@WebServlet(urlPatterns={"/myservlet"})
@MultipartConfig
public class Myservlet extends HttpServlet {

    // ...
}