我有以下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循环。这是怎么造成的,我该如何解决?
答案 0 :(得分:20)
如果您想使用Servlet 3.0 HttpServletRequest#getParts()
,则必须使用@MultipartConfig
注释您的servlet。
@WebServlet(urlPatterns={"/myservlet"})
@MultipartConfig
public class Myservlet extends HttpServlet {
// ...
}