众所周知,form表单中 enctype是设置表单的MIME编码,默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form- data,才能完整的传递文件数据,enctype="multipart/form-data"是上传二进制数据, form表单里面的普通文本input值域以二进制的方式传过去。此种情况,使用request.getParameter()是无法获得普通文本域值的。So in the case 如何获得普通文本域值哪,代码如下:
web.xml
<servlet>
<servlet-name>MultiPartServlet</servlet-name>
<servlet-class>cn.com.servlet.MultiPartServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MultiPartServlet</servlet-name>
<url-pattern>/MultiPartServlet</url-pattern>
</servlet-mapping>
input.jsp
<form action="MultiPartServlet" method="post" enctype="multipart/form-data">
普通文本域 <input type="text" name="userName" />
上传域 <input type="file" name="myFile" />
<input type="submit" value="提交" />
</form>
servlet.java
package cn.com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* MultiPartServlet
* @author lyh
* @version 2013-4-10
* @see MultiPartServlet
* @since
*/
public class MultiPartServlet extends HttpServlet
{
private static final long serialVersionUID = 1325954832925856683L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
doPost(req, resp);
}
@SuppressWarnings("unchecked")
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
// SetCharacterEncoding = UTF-8
req.setCharacterEncoding("utf-8");
// Judge multipart or not
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
// Multipart form
if (isMultipart)
{
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
try
{
// Parse the request
List<FileItem> items = upload.parseRequest(req);
// Process the uploaded items
Iterator<FileItem> iter = items.iterator();
// Parameters map
Map<String,String> params = new HashMap<String,String>();
// Do list
while (iter.hasNext())
{
FileItem item = iter.next();
// Form Field
if (item.isFormField())
{
// Field name
String name = item.getFieldName();
// Set charset = UTF-8 Default = ISO-8859-1
// Get field value
String value = item.getString("utf-8");
// Put into map
params.put(name, value.trim());
}
}
// Set contentType= html charset=utf-8
resp.setContentType("text/html;charset=utf-8");
String userName = (String)params.get("userName");
PrintWriter out = resp.getWriter();
// Write out
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print("username:" + userName + "<br>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
catch (Exception fue)
{
fue.printStackTrace();
}
}
// Simple form
else
{
// SetCharacterEncoding = UTF-8
req.setCharacterEncoding("utf-8");
// Set contentType= html charset=utf-8
resp.setContentType("text/html;charset=utf-8");
String userName = (String)req.getParameter("userName");
PrintWriter out = resp.getWriter();
// Write out
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print("username:" + userName + "<br>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
}
解析过程参见上述doPost()方法,需要借助apache commons-fileupload-xx.jar 和 commons-io-xx.jar。
涉及到解析时中文乱码的问题,需要使用 item.getString("utf-8"),查看源码:
public String getString(String charset)
throws UnsupportedEncodingException
{
return new String(get(), charset);
}
public String getString()
{
byte rawdata[];
String charset;
rawdata = get();
charset = getCharSet();
if(charset == null)
charset = "ISO-8859-1";
return new String(rawdata, charset);
UnsupportedEncodingException e;
e;
return new String(rawdata);
}
因为此时的默认编码为ISO-8859-1 ,需要额外的设置。