2 Replies Latest reply on Mar 2, 2009 5:20 PM by wierzgala

    file upload problem null

    wierzgala

      Hi everyone,


      I Am trying to develop a relatively Web 2.0 application, and 6 days ago I faced a problem with <s:fileUpload> tag. I get null for my byte array holding data and also for a contentType. I checked that even setters aren’t called. I wanted to see what is in the request so I added my own filter wrapped around Seam MultipartFilter. It shows basic info about request. Every time I send a request (except request from logging page) the length of request is -1 and contentType is null. I am really confused and stuck for good. I hope somebody will know how to solve this issue. I suspect the answer will be trivial.


      Here is my form



      <s:validateAll>
      <h:form id="UploadPhotoForm" enctype="multipart/form-data">
                      <fieldset>
                      <s:decorate id="imageField">
                              <s:fileUpload id="imageData" accept="image/*"
                              data="#{upload.imageData}"
                              contentType="#{upload.imageContentType}"
                              fileName="#{upload.title}" />
                      </s:decorate>
                      <s:button id="save" value="Upload" action="#{upload.savePicture}"/>
                      </fieldset>
      </h:form>
      </s:validateAll>



      And my action


      @Name("upload")
      @Scope(ScopeType.PAGE)
      @Local
      public class UploadPictureAction implements Serializable
      {
              @In
              User user;
              
              @Logger
              Log log;
              
              private static final long serialVersionUID = 1L;
      
              private byte[] imageData;
              private String imageContentType;
              private String title;
              
              
              public byte[] getImageData() 
              {
                      return imageData;
              }
              public void setImageData(byte[] imageData) 
              {
                      this.imageData = imageData;
                      System.out.println("Value:"+imageData);
              }
              public String getImageContentType() 
              { 
                      return imageContentType; 
              }
              public void setImageContentType(String imageContentType) 
              {
                      this.imageContentType = imageContentType;
              }
              public String getTitle() {
                      return title;
              }
              public void setTitle(String title) {
                      this.title = title;
              }
              
              public void savePicture()
              {
                      PicturesManager pm = PicturesManager.getInstance();
                      try
                      {
                              System.out.println("imageContentType:"+imageContentType);
                              System.out.println("imageData:"+imageData);
                      }
                      catch(Exception e)
                      {
                              log.error(e.getMessage(),e);
                      }
              }
      


      My components.xml


      <core:init debug="true" jndi-pattern="@jndiPattern@"/>
      
         
      
         <core:manager concurrent-request-timeout="500"
                       conversation-timeout="120000"
                       conversation-id-parameter="cid"
                       parent-conversation-id-parameter="pid"/>
      
              
         <persistence:managed-persistence-context name="em"
                                           auto-create="true"
                                entity-manager-factory="#{erasmusDatabase}"/>
      
         <persistence:entity-manager-factory name="erasmusDatabase"
                            persistence-unit-name="myErasmus"/>
      
         <security:identity authenticate-method="#{authenticator.authenticate}" remember-me="true"/>
      
              <web:ajax4jsf-filter force-parser="true" 
                           enable-cache="true" 
                           log4j-init-file="custom-log4j.xml"
                           url-pattern="*.seam"/>
         <web:multipart-filter create-temp-files="true"
                            max-request-size="1000000" 
                            url-pattern="*.seam" />
         <event type="org.jboss.seam.security.notLoggedIn">
            <action execute="#{redirect.captureCurrentView}"/>
         </event>
         <event type="org.jboss.seam.security.loginSuccessful">
            <action execute="#{redirect.returnToCapturedView}"/>
         </event>
      
         <mail:mail-session host="localhost" port="2525" username="test" password="test" />
      


      web.xml


      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
        <display-name>myErasmus</display-name>
        <welcome-file-list>
          <welcome-file>index.html</welcome-file>
          <welcome-file>index.htm</welcome-file>
          <welcome-file>index.jsp</welcome-file>
          <welcome-file>default.html</welcome-file>
          <welcome-file>default.htm</welcome-file>
          <welcome-file>default.jsp</welcome-file>
        </welcome-file-list>
        <servlet>
          <servlet-name>Faces Servlet</servlet-name>
          <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
          <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
          <servlet-name>Faces Servlet</servlet-name>
          <url-pattern>*.seam</url-pattern>
        </servlet-mapping>
        <context-param>
          <param-name>org.richfaces.SKIN</param-name>
          <param-value>blueSky</param-value>
        </context-param>
        <listener>
          <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
        </listener>
        <filter>
          <filter-name>Seam Filter</filter-name>
          <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
        </filter>
        <filter-mapping>
          <filter-name>Seam Filter</filter-name>
          <url-pattern>/*</url-pattern>
        </filter-mapping>
        <servlet>
          <servlet-name>Seam Resource Servlet</servlet-name>
          <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>
        </servlet>
        <servlet-mapping>
          <servlet-name>Seam Resource Servlet</servlet-name>
          <url-pattern>/seam/resource/*</url-pattern>
        </servlet-mapping>
        <context-param>
          <param-name>facelets.DEVELOPMENT</param-name>
          <param-value>true</param-value>
        </context-param>
        <context-param>
          <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
          <param-value>.xhtml</param-value>
        </context-param>
        <security-constraint>
          <display-name>Restrict raw XHTML Documents</display-name>
          <web-resource-collection>
            <web-resource-name>XHTML</web-resource-name>
            <url-pattern>*.xhtml</url-pattern>
          </web-resource-collection>
          <auth-constraint/>
        </security-constraint>
      </web-app>
      


      Additionaly my filter


      @Startup
      @Scope(ScopeType.APPLICATION)
      @Name("UploadFilter")
      @BypassInterceptors
      @Filter(around="org.jboss.seam.web.multipartFilter")
      
      public class ErasmusUploadFilter extends AbstractFilter
      {
      
              public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException 
              {
                      
                      HttpServletRequest httpRequest = (HttpServletRequest) arg0;
                      
                      System.out.println("[UploadFilter] ContentLength:"+httpRequest.getContentLength());
                      System.out.println("[UploadFilter] ContentType:" + httpRequest.getContentType());
                      Enumeration a = arg0.getAttributeNames();
                      while(a.hasMoreElements())
                      {
                              Object elem = a.nextElement();
                              System.out.println("[UploadFilter] Atribute:" + elem + " wartosc:" + arg0.getAttribute((String)elem));
                      }
                      for(Object e: arg0.getParameterMap().keySet())
                      {
                              System.out.println("[UploadFilter] Parameter:"+ e.toString());
                      }
                      arg2.doFilter(arg0, arg1);
                      
              }
      
      }
      



      and fragment of console output


      09:23:25,250 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:25,250 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:26,474 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:26,475 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:27,209 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:27,209 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:27,255 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:27,256 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:27,718 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:27,718 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:27,733 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:27,733 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:27,970 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:28,049 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:53,081 INFO  [STDOUT] [UploadFilter] ContentLength:113
      09:23:53,081 INFO  [STDOUT] [UploadFilter] ContentType:application/x-www-form-urlencoded
      09:23:53,082 INFO  [STDOUT] [UploadFilter] Parameter:login:password
      09:23:53,082 INFO  [STDOUT] [UploadFilter] Parameter:login:username
      09:23:53,082 INFO  [STDOUT] [UploadFilter] Parameter:login:login
      09:23:53,082 INFO  [STDOUT] [UploadFilter] Parameter:login
      09:23:53,082 INFO  [STDOUT] [UploadFilter] Parameter:javax.faces.ViewState
      09:23:53,999 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:53,999 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:53,999 INFO  [STDOUT] [UploadFilter] Parameter:cid
      09:23:54,708 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:54,709 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:54,776 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:54,776 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:55,072 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:55,072 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:55,384 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:55,385 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:58,272 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:58,272 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:58,968 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:58,968 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:59,028 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:59,028 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:23:59,279 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:23:59,279 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:00,753 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:00,753 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:01,179 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:01,179 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:01,345 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:01,345 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:01,554 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:01,554 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:01,676 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:01,676 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:02,058 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:02,058 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:02,181 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:02,182 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:02,225 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:02,225 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:22,954 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:22,955 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:22,955 INFO  [STDOUT] [UploadFilter] Parameter:cid
      09:24:22,955 INFO  [STDOUT] [UploadFilter] Parameter:actionMethod
      09:24:23,011 INFO  [STDOUT] imageContentType:null
      09:24:23,011 INFO  [STDOUT] imageData:null
      09:24:23,395 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:23,396 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:23,420 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:23,420 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:23,779 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:23,780 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:24,059 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:24,059 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:24,228 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:24,228 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:24,374 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:24,374 INFO  [STDOUT] [UploadFilter] ContentType:null
      09:24:24,385 INFO  [STDOUT] [UploadFilter] ContentLength:-1
      09:24:24,385 INFO  [STDOUT] [UploadFilter] ContentType:null
      

        • 1. Re: file upload problem null
          mwohlf

          from the book Seam in Action by Dan Allen:



          The command components in the Seam UI component library, <s:link> and
          <s:button>, support data model selections, despite the fact that they don’t submit a
          form or restore the JSF UI component tree like the JSF command components.
          



          Try:



          <h:commandButton id="save" value="Upload" action="#{upload.savePicture}"/>




          • 2. Re: file upload problem null
            wierzgala

            Thanks. It worked. I knew it's something trivial. If I had asked earlier I wouldnt have wasted whole week for it. Thanks again.