上传数据的时候form应该写成类似如下形式:
<form action="InputResp" ENCTYPE="multipart/form-data" method="post">

解决方案 »

  1.   

    wuyg(wuyuguang) :我就是用的struts带的例子改的,这点肯定没问题。真的没人知道吗?我看了一下src,感觉好象不太对
      

  2.   

    > This is an old post that follows.  I have found the same problem with Struts
    > 1.01.  Is this behaviour a bug or is it how Struts is meant to work?
    > Also can someone please tell me what setting
    > the value of redirect="true" does besides clearing the request attributes.
      

  3.   

    不知道,希望了解解决之后,发邮件给我[email protected]。谢谢!
      

  4.   

    我想不通你为什么要传输两便,在第二个action的时候没有得到需要传输的数据,
      

  5.   

    是啊!没有必要放两个action在这里啊!
      

  6.   

    to:BillyW(阿弥陀佛)
    我也在apache的maillist里看过这个topic,看来还不是我一个人遇到,而且在1.1里也没有解决。to:zxl19790710(雪龙),yujinping(JavaFan) ,不只是传两个action,我传4个呢。三个xml文件上传上来,解析,审核,再调用后台ejb,你们认为放到1个action里做???????
    to:Lihaitao312(李海涛)
    没有解决,但我用别的方法饶开了这个问题,改动如下
    <action-mappings>
        <!-- Upload Action -->
        <action    path="/upload"
                   type="org.apache.struts.webapp.upload.UploadAction"
                   name="uploadForm">
            <forward name="display" path="/upload2.do" />
       </action>
       <action    path="/upload2"
                   type="org.apache.struts.webapp.upload.UploadAction">
            <forward name="display" path="/display.jsp" />
       </action>
    </action-mappings>
    然后你在第二个action里会发现request中有个叫uploadForm的属性,里边就是我们想要的东西。注意所有后续action都不能声明form,否则异常。
    这种方法虽然能解决问题,但总感觉不是struts的风格,不那么自然。
      

  7.   

    我不直接用struts,我抽取其中我要的功能形成自己的类就没有这些问题
      

  8.   

    1.从"/upload" forward到 "/upload2",request是同一个实例2.如果Action定义了Form,ActionServlet先用request的数据创建Form实例并放到request的attributes中,再调用Action的perform方法3.如果request包含上传数据((request.getContentType.startsWith("multipart/form-data"))&&(request.getMethod().equalsIgnoreCase("POST")),ActionServlet在创建Form实例时用MultipartIterator处理request.getInputStream()中的上传数据因此:
        如果/upload和/upload2都定义了Form,request.getInputStream()中的上传数据在ActionServlet处理Action "/upload"时就读完了,在处理Action "/upload2"时又尝试从request.getInputStream()中取上传数据,当然会取不到了。
        如果/upload定义Form,而/upload2不定义Form,由于处理/upload时,Form实例已经放到request的attributes中了,所以在/upload2中可以通过request.getAttribute(formName)取到Form实例。表达能力有限,请参考struts中以下class的源代码:
    class org.apache.struts.action.ActionServlet
        process(HttpServletRequest request, HttpServletResponse response)
        processPopulate(ActionForm formInstance, ActionMapping mapping, HttpServletRequest request)class org.apache.struts.util.RequestUtils
        populate(Object bean, String prefix, String suffix, HttpServletRequest request)class orgapache.struts.upload.MultipartIterator
      

  9.   

    楼上的厉害,
    楼主根据你所说第二个action应当是解析,为什么还要upload,而不是通过已存在的文件直接解析呢
      

  10.   

    to:cbhyk() 精彩,鼓掌,很感谢。
    我感觉是在action2的form初始化的时候struts对multipart/form-data考虑的不周全,用MultipartIterator读request来初始化form的数据,request的数据在别的content-type可以一直保存,但stream类型的数据就只能用一次,所以导致forward到第二个action时候,如果定义了form就会读取错误。应该是如果是multipart/form-data类型,在读出以后放在request的属性中,forward以后从request的属性中初始化form,而不是再次从request中取得。至于struts是以什么样的方式传递的数据,struts并没有具体说明,我也是遍历了request的属性才发现的,而且key值也没有写明命名方式,是struts的内部实现。感觉这么用是饶开了struts,并不很好,你有什么自然的方式吗?to:zxl19790710(雪龙),我的文件并不在服务器保存是直接解析然后向后传递的。
      

  11.   

    to:powerman_lyj(刘瑜江)不知道你用不用struts-config.xml
      

  12.   

    /upload的定义中的name属性就是request属性中Form的key:
    <action    path="/upload"
                   type="org.apache.struts.webapp.upload.UploadAction"
                   name="uploadForm">
            <forward name="display" path="/upload2.do" />
    </action>
    在这个定义中,"uploadForm"即是Form的key。参考:
    ActionServlet的processActionForm方法。