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 ,需要额外的设置。
- Form表单enctype="multipart/form-data" 提交 获得普通文本域值
- form表单 enctype="multipart/form-data"
- form表单enctype="multipart/form-data"
- enctype="multipart/form-data"表单传值问题
- Ajax 提交 form ENCTYPE="multipart/form-data" 的方法
- form表单中的enctype="multipart/form-data"
- form表单中的enctype="multipart/form-data"
- 表单form的enctype="multipart/form-data"使用体会
- form表单中的enctype="multipart/form-data"
- 表单form的enctype="multipart/form-data"
- 表单form的enctype="multipart/form-data"使用体会
- 表单form的enctype="multipart/form-data"使用体会
- 文件上传 form 表单 enctype="multipart/form-data" 分析
- 表单form的enctype="multipart/form-data"使用体会
- 表单form的enctype="multipart/form-data"使用体会
- form表单中的enctype="multipart/form-data"什么意思?
- form表单中的enctype="multipart/form-data"什么意思?
- form表单中Enctype=multipart/form-data
- 【rzxt】巧妙设置轻松达到提升系统运行速度
- Android菜单详解(四)——使用上下文菜单ContextMenu
- Delphi 钩子 注入线程(2)
- IOS介绍及开发准备工作
- 设置Dialog全屏显示的两种方式
- Form表单enctype="multipart/form-data" 提交 获得普通文本域值
- c#生成随机数
- CATransition的简单使用
- mysql图文安装教程
- 分享一款智能dns系统
- Android的View类详解
- C++模板简单分析与举例
- 基于 OpenGL 进行 3D 图形开发
- iPhone开发环境介绍