在使用表单传送数据的时候,如果form 加了enctype="multipart/form-data" 这个属性,那么表单请求传到另一个jsp或servlet 里时
是不能用request.getParameter()来获取到各个表单元素的值的。
可以通用这样(上传组件提供的API):

boolean isMultipart = ServletFileUpload.isMultipartContent(request);
 if (isMultipart) {
  // Create a factory for disk-based file items
  org.apache.commons.fileupload.FileItemFactory factory = new DiskFileItemFactory();

// Create a new file upload handler
  ServletFileUpload upload = new ServletFileUpload(factory);
  // Parse the request
  List /* FileItem */items = upload.parseRequest(request);

// Process the uploaded items
  Iterator iter = items.iterator();
 
  while (iter.hasNext()) {
   org.apache.commons.fileupload.FileItem item = (org.apache.commons.fileupload.FileItem) iter
     .next();
   if (item.isFormField()) {
    String name = item.getFieldName();
    String value = item.getString("GBK");
    //out.println(name + "=" + value);
    params.put(name.toUpperCase(), value.trim());
   } ......
**************************************************************************************

使用multipart/form-data上传时,发送的请求和一般的http不一样,需要转化后才能读其他参数。  
   
  如果你用spring,它提供一个MultiRequestResolver,只需要:  
  MultipartHttpServletRequest   multipartRequest   =   (MultipartHttpServletRequest)   request;  
  然后就能正常读取参数:  
  multipartRequest.getParameter("xxx");  
   
  以下是spring的处理方法,必须首先安装commons-fileupload组件:  
   
  public   MultipartHttpServletRequest   resolveMultipart(HttpServletRequest   request)   throws   MultipartException   {  
  DiskFileUpload   fileUpload   =   this.fileUpload;  
  String   enc   =   determineEncoding(request);  
   
  //   use   prototype   FileUpload   instance   if   the   request   specifies  
  //   its   own   encoding   that   does   not   match   the   default   encoding  
  if   (!enc.equals(this.defaultEncoding))   {  
  fileUpload   =   new   DiskFileUpload();  
  fileUpload.setSizeMax(this.fileUpload.getSizeMax());  
  fileUpload.setSizeThreshold(this.fileUpload.getSizeThreshold());  
  fileUpload.setRepositoryPath(this.fileUpload.getRepositoryPath());  
  fileUpload.setHeaderEncoding(enc);  
  }  
   
  try   {  
  List   fileItems   =   fileUpload.parseRequest(request);  
  Map   parameters   =   new   HashMap();  
  Map   multipartFiles   =   new   HashMap();  
  for   (Iterator   it   =   fileItems.iterator();   it.hasNext();)   {  
  FileItem   fileItem   =   (FileItem)   it.next();  
  if   (fileItem.isFormField())   {  
  String   value   =   null;  
  try   {  
  value   =   fileItem.getString(enc);  
  }  
  catch   (UnsupportedEncodingException   ex)   {  
  logger.warn("Could   not   decode   multipart   item   '"   +   fileItem.getFieldName()   +  
          "'   with   encoding   '"   +   enc   +   "':   using   platform   default");  
  value   =   fileItem.getString();  
  }  
  String[]   curParam   =   (String[])   parameters.get(fileItem.getFieldName());  
  if   (curParam   ==   null)   {  
  //   simple   form   field  
  parameters.put(fileItem.getFieldName(),   new   String[]   {   value   });  
  }  
  else   {  
  //   array   of   simple   form   fields  
  String[]   newParam   =   StringUtils.addStringToArray(curParam,   value);  
  parameters.put(fileItem.getFieldName(),   newParam);  
  }  
  }  
  else   {  
  //   multipart   file   field  
  CommonsMultipartFile   file   =   new   CommonsMultipartFile(fileItem);  
  multipartFiles.put(file.getName(),   file);  
  if   (logger.isDebugEnabled())   {  
  logger.debug("Found   multipart   file   ["   +   file.getName()   +   "]   of   size   "   +   file.getSize()   +  
          "   bytes   with   original   filename   ["   +   file.getOriginalFilename()   +   "],   stored   "   +  
          file.getStorageDescription());  
  }  
  }  
  }  
  /*****   注意   parameters   就是普通的text之类的字段的值   *****/  
  return   new   DefaultMultipartHttpServletRequest(request,   multipartFiles,   parameters);  
  }  
  catch   (FileUploadBase.SizeLimitExceededException   ex)   {  
  throw   new   MaxUploadSizeExceededException(this.fileUpload.getSizeMax(),   ex);  
  }  
  catch   (FileUploadException   ex)   {  
  throw   new   MultipartException("Could   not   parse   multipart   request",   ex);  
  }  
  }  
**************************************************************************************

<form name="userInfo" method="post" action="first_submit.jsp"  ENCTYPE="multipart/form-data">
表单标签中设置enctype="multipart/form-data"来确保匿名上载文件的正确编码。
如下:
 <tr>
    <td height="30" align="right">上传企业营业执照图片:</td>
    <td><INPUT TYPE="FILE" NAME="uploadfile" SIZE="34"  onChange="checkimage()"></td>
  </tr>
就得加ENCTYPE="multipart/form-data"。
表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application /x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form- data,才能完整的传递文件数据,进行下面的操作.
enctype=\"multipart/form-data\"是上传二进制数据; form里面的input的值以2进制的方式传过去。
form里面的input的值以2进制的方式传过去,所以request就得不到值了。 也就是说加了这段代码,用request就会传递不成功,

取表单值加入数据库时,用到下面的:
 SmartUpload su = new SmartUpload();//新建一个SmartUpload对象
 su.getRequest().getParameterValues();取数组值
 su.getRequest().getParameter( );取单个参数单个值

表单form的enctype="multipart/form-data"使用疑惑的更多相关文章

  1. form 中Enctype=multipart/form-data 的作用

    form 中Enctype=multipart/form-data 的作用 ENCTYPE="multipart/form-data"用于表单里有图片上传. <form na ...

  2. 表单:!!!常用JS: form 表单代码

    手机(文本框): <input type="text" name="" maxlength="11" placeholder=&quo ...

  3. form表单标签的enctype属性的作用

    Enctype是指定将数据回发到server时浏览器使用的编码类型.其编码类型有下面三种 一. application/x-www-form-urlencoded         这是通过表单发送数据 ...

  4. Form表单标签的Enctype属性的作用及应用示例介绍

    Enctype :指定将数据回发到服务器时浏览器使用的编码类型.用于表单里有图片上传. 编码类型有以下三种: application/x-www-form-urlencoded: 在发送前编码所有字符 ...

  5. Form的enctype="multipart/form-data"作用

    <form class="form-horizontal" role="form" method="post" action=&quo ...

  6. 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法

    部分转载于: http://blog.csdn.net/georgejin/article/details/1706647 http://www.cnblogs.com/loveyunk/p/6089 ...

  7. 进一步丰富和简化表单管理的组件:form.js

    上文<简洁易用的表单数据设置和收集管理组件>介绍了我自己的表单管理的核心内容,本文在上文的基础上继续介绍自己关于表单初始值获取和设置以及表单数据提交等内容方面的做法,上文的组件粒度很小,都 ...

  8. servler中表单加了enctype="multipart/form-data"属性后request就接收不到表单传过来的值了

    在解决博问node.js接受参数的时候,发现当form中添加enctype:"multipart/form-data",后台确实获取不到数据,于是跑到百度上查了一下,终于明白为什么 ...

  9. 表单(上)EasyUI Form 表单、EasyUI Validatebox 验证框、EasyUI Combobox 组合框、EasyUI Combo 组合、EasyUI Combotree 组合树

    EasyUI Form 表单 通过 $.fn.form.defaults 重写默认的 defaults. 表单(form)提供多种方法来执行带有表单字段的动作,比如 ajax 提交.加载.清除,等等. ...

随机推荐

  1. java中synchronized关键字的用法

    在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...

  2. MySQL 函数大全

    mysql函数大全 对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NU ...

  3. Servlet生命周期中的service方法分析

    问题ServletLifeCycle中的service方法内,有super.service(request, response); 会执行this.doGet(HttpServletRequest r ...

  4. 创建与使用Web API

    今天做了一个练习,实现单独的Web API project.以前只是在ASP.NET MVC project内创建. 创建一个Web API project,可参考下面步骤: 点击OK之后,出现另外一 ...

  5. android 开发环境搭建

    http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/2769409.html http://jingyan.baidu.com/article/7 ...

  6. c#通过oledb获取excel文件表结构信息

    这个问题来自论坛提问,同理可以获得access等数据库的表结构信息. using System; namespace ConsoleApplication11 { class Program { pu ...

  7. iOS阶段学习第20天笔记(MRC内存管理)

    iOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效      OC中采用 ...

  8. java.lang.NoClassDefFoundError: com/google/gson/Gson错误的解决

    SSH返回JSON格式的数据时,需要用到gson,将gson-1.6.jar添加进Build path以后运行,出错: 后来把gson-1.6.jar复制到WEB-INF/lib/下再运行,就没再出这 ...

  9. Android存储空间不足的解决办法

    安装应用时,有时会出现错误Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE,这是存储空间不足的错误,这时就只能将应用安装到SD卡,在And ...

  10. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...