Form表单enctype="multipart/form-data" 提交 获得普通文本域值

来源:互联网 发布:qt5串口通信 源码 编辑:程序博客网 时间:2024/05/16 17:33

      众所周知,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 ,需要额外的设置。


      

原创粉丝点击