日期:2014-05-17  浏览次数:20695 次

Struts 2上传文件和表单数据冲突
各位大神,我今天在写一个工程,是用了Struts+Hibernate的。现在遇到了问题。
在一个JSP页面中,我要传一个课程号,还有上传目录,课程号有的是hidden标签。但是,一直出错。
代码很短的,如下:
<struts:form action="ReleaseHomework" enctype="multipart/form-data" method="post">
  <struts:textarea name="homeworktitle" label="请输入作业题目"></struts:textarea>
  <fck:editor instanceName="homeworkcontent">请输入作业内容</fck:editor>
  <struts:file name="homeworkfile" label="请选择文件"></struts:file>
  <struts:hidden name="courseid" value="%{#request.courseid}"></struts:hidden>
  <struts:submit value="发布作业" method="ReleaseHomework"></struts:submit>
  </struts:form>

这里面,传递Action时,有courseid读不到值,一直是null。
我调试了一下,发现是这句话的问题,enctype="multipart/form-data"
但是,不加上这句话,一直不能上传文件,加上这句话,就拿不到courseid的值,我2个都要,不知道怎么办。跪求各位大神帮忙啊。偶感激不尽啊。

------解决方案--------------------


enctype属性有三种:
一:
application/x-www.form-urlencoded:默认编码方式。只会处理表单域力的value属性,该方式会将表单域的值处理成URL编码方式。但是不能处理上传文件的。编码是iso-8859-1
二:
enctype="multipart/form-data"这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定的文件的内容也封装到请求参数里。上传文件使用这个方式。
三:
text/plain:这种方式 当表单的action属性为mailto:URL的形式时比较方便,这种方式主要用于直接、通过表单方式发送邮件 (已经不再采用了)。

一旦设置了表单为第二方式的话。就无法用getParameter方式获取到除文件域以外的表单控件。

解决方法如下:

需要导入包。
import org.apache.commons.fileupload.DiskFileUpload;
应该jar包名叫commons-fileupload.jar吧
还要有commons-io。jar

Java code

List   items   =   null;
                              try{
                DiskFileUpload   upload   =   new   DiskFileUpload();
                items   =   upload.parseRequest(request);
                Iterator   itr   =   items.iterator();
                while(itr.hasNext())   {
                FileItem   item   =   (FileItem)   itr.next();
                if(item.isFormField())   {
                String   fieldName   =   item.getFieldName();
                if(fieldName.equals( "[color=#FF0000]控件名1[/color]")){
                       //然后取值     
                       String a = filedName.equals("控件1");    
                       sysout a//打印控制台[快捷键]
               
                }
                if(fieldName.equals( "[color=#FF0000]控件名2[/color]")){
                        //然后取值  
               
                }
                }
                }

                }catch(Exception   e)   {
                    logger.error( "Exception: "   +   e);
                }

------解决方案--------------------
好吧我又二了,在javacode里不能设置字体颜色了。
------解决方案--------------------
1楼上传方式是使用的apache commoning-fileupload,我不知道楼主使用的是这个还是struts2的文件上传?若是前者你参考1楼,若是后者,你在action里面private String courseid;set,get该属性,同时还有File,FileContentType,..属性,,,,同样,set,get