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();
                }
            }
        }
        }

}

Reply via email to