file upload problem null
wierzgala Mar 2, 2009 9:28 AMHi 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