I extended MyFaces to upload work.
As I've seen in
org.apache.myfaces.custom.fileupload.HtmlFileUploadRenderer.java
"decode" method there is only decode of MultipartRequestWrapper.
When using portlets with MyFacesGenericPortlet, an ActionRequest is
passed in FacesContext. So the decode of this object is not done.
To solve this problem I've extended HtmlFileUploadRenderer in
CustomHtmlFileUploadRenderer.java attached to these email.
In these extension, the decode is made based on MultipartActionRequest
class that is part of cocoon library and is a wrapper of ActionRequest.
So, I had to extend MyFacesGenericPortlet to wrap the action request in
an MultipartActionRequest object.
How my extension of MyFacesGenericPortlet includes many other
functionalities I did not attached to these email. But the
implementation is simply to override the processAction like these:
public void processAction(ActionRequest request, ActionResponse
response) throws PortletException, IOException {
if(contentType!=null){
if(contentType.startsWith("multipart/form-data")){
try{
request = (MultipartActionRequest)
rf.getServletRequest(request);
}catch(Exception e){
e.printStackTrace();
}
}
}
super.processAction(request, response);
}
With these done, configure faces-config.xml to use the renderer created,
like this:
<render-kit>
<renderer>
<component-family>javax.faces.Input</component-family>
<renderer-type>org.apache.myfaces.FileUpload</renderer-type>
<renderer-class>br.gov.trf2.jfes.intranet.faces.renderer.CustomHtmlFileUploadRenderer</renderer-class>
</renderer>
</render-kit>
Now, the tag inputfileupload works.
I would like to see this implemented in next releases of myfaces.
Sébastien Marin wrote:
Hello, i use a portal Jetspeed with a webapp Portlet in JSF.
So i want to use the inputfilupload component in a jsp.
I have a multipart/form-data enctype form.
I have the multipart/form-data filter in the web.xml.
But it seems that the filter isn't execute and i just have a refresh of my page.
The upload function of my bean isn't execute...
Hox can i do?
Thank a lot for your help.
Cordialement, Sébastien MARIN.
package br.gov.trf2.jfes.intranet.faces.renderer;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.portlet.ActionRequest;
import org.apache.cocoon.portlet.multipart.MultipartActionRequest;
import org.apache.cocoon.servlet.multipart.PartOnDisk;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.portlet.PortletFileUpload;
import org.apache.myfaces.custom.fileupload.HtmlFileUploadRenderer;
import org.apache.myfaces.custom.fileupload.HtmlInputFileUpload;
import org.apache.myfaces.custom.fileupload.UploadedFile;
import org.apache.myfaces.custom.fileupload.UploadedFileDefaultFileImpl;
import org.apache.myfaces.custom.fileupload.UploadedFileDefaultMemoryImpl;
import
br.gov.trf2.jfes.intranet.fileupload.MultipartActionRequestFileItemFactory;
public class CustomHtmlFileUploadRenderer extends HtmlFileUploadRenderer {
@Override
public void decode(FacesContext facesContext, UIComponent uiComponent) {
System.out.println("decoding");
super.decode(facesContext, uiComponent);
if(facesContext.getExternalContext().getRequest() instanceof
MultipartActionRequest){
MultipartActionRequest mpReq = (MultipartActionRequest)
facesContext.getExternalContext().getRequest();
String paramName = uiComponent.getClientId(facesContext);
PartOnDisk p = (PartOnDisk) mpReq.get(paramName);
FileItem fileItem = null;
if(p!=null){
MultipartActionRequestFileItemFactory factory = new
MultipartActionRequestFileItemFactory(mpReq);
fileItem = (FileItem) factory.createItem(paramName,
p.getMimeType(), true, p.getFile().getAbsolutePath());
}
if (fileItem != null)
{
try{
UploadedFile upFile;
upFile = new UploadedFileDefaultFileImpl( fileItem );
((HtmlInputFileUpload)uiComponent).setSubmittedValue(upFile);
((HtmlInputFileUpload)uiComponent).setValid(true);
}catch(IOException ioe){
ioe.printStackTrace();
}
}
}
}
}