posts - 0,  comments - 17,  trackbacks - 0
by xyz

在使用表单传送数据的时候,如果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( );取单个参数单个值

posted on 2008-03-14 10:52 xyz 阅读(63041) 评论(5)  编辑  收藏 所属分类: 我的文章

FeedBack:
# re: 表单form的enctype="multipart/form-data"使用体会[未登录]
2012-03-26 17:13 | s
dd  回复  更多评论
  
# re: 表单form的enctype="multipart/form-data"使用体会[未登录]
2013-01-29 14:28 | 111
1111  回复  更多评论
  
# re: 表单form的enctype="multipart/form-data"使用体会
2013-03-29 11:33 | asdfsd
asdf  回复  更多评论
  
# re: 表单form的enctype="multipart/form-data"使用体会
2013-03-29 11:33 | asdfsd
sadf  回复  更多评论
  
# re: 表单form的enctype="multipart/form-data"使用体会[未登录]
2015-07-27 18:52 | zxw
受教了  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

<2013年3月>
242526272812
3456789
10111213141516
17181920212223
24252627282930
31123456

留言簿

随笔档案(1)

文章分类(44)

文章档案(46)

收藏夹(1)

Adobe

AOP

API

appServer

BI

c

  • c-free
  • codeblocks
  • codelite
  • CodeLite IDE 是一个强大的开源,跨平台的 C/C++整合开发环境. 支持包括 Windows、Linux 和 Mac 系统下运行
  • codelite官网
  • dev-c++
  • Dev-C++是一个C&C++开发工具,它是一款自由软件,遵守GPL协议。
  • GCC
  • GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada 与其他语言。

Cache

CMS

DB

eclipse

FreeMarker

hibernate

html5

ibatis

java

jquery

js

json

Linux

Log

mail server

mobile

mysql

oauth

openID

other

PHP

portal

report

Scheduler

schema

Security

SOA

spring

struts

UI原型设计

w3c

Wap

webservice

xml

供应链管理

博客链接

好网站

工作流

开源网

招聘

插件下载

操作系统

构建可伸缩的系统

构建工具

测试

  • IETest
  • IE官网
  • OpenSTA
  • Siege
  • Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力

游戏

源码托管

经营

资源

金融/财务

搜索

  •  

最新评论