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

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


      

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值