1 2 Previous Next 25 Replies Latest reply: Feb 23, 2010 3:11 AM by Stefan Tausendpfund RSS

Can't get rich:fileUpload to work (using 2.0.0.A)

Mahesh Lavannis Newbie

I am trying to run the richfaces demo example that is shipped with portlet bridge. When I try to upload a file, I get no exceptions. However, the file does not upload either. I see no file listed in the "Uploaded Files Info".

Also, I put a print i the listener function and it is never called.

If someone has managed to get fileUpload to work, can I please get some advice? Maybe some sample code? Thanks!

Again, I am using version 2.0.0.A

  • 1. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Wesley Hales Master

    The multipart request is handled differently in the 2.0 world than 168, any help debugging would be great.

  • 2. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Stefan Tausendpfund Novice

    Hello,

    we also have problems with the fileUpload component and portletbridge. It worked well in previous versions.
    The fileUploadListener is not called in portal environment.
    The fileupload in richfaces demo of portletbridge does not work on my server. Does this work on your side?

    I created also a small demo using this environment (created with maven)
    JSF 1.2_13 (copied to server\default\deploy\jboss-web.deployer\jsf-libs)
    richfaces-3.3.3-SNAPSHOT (from 02.11 - there was also some changes in multipart requests submitted this week https://jira.jboss.org/jira/browse/RF-7927) - also tested 3.3.2.SR1
    portletbridge SNAPSHOT - also BETA
    jbossportal 2.7.2
    configration in web.xml:

     <filter>
     <display-name>Ajax4jsf Filter</display-name>
     <filter-name>ajax4jsf</filter-name>
     <filter-class>org.ajax4jsf.Filter</filter-class>
     <init-param>
     <param-name>createTempFiles</param-name>
     <param-value>false</param-value>
     </init-param>
     <init-param>
     <param-name>maxRequestSize</param-name>
     <param-value>100000</param-value>
     </init-param>
     </filter>
    

    configuration in faces-config.xml:
     <application>
     <view-handler> org.jboss.portletbridge.application.PortletViewHandler</view-handler>
     <state-manager>org.jboss.portletbridge.application.PortletStateManager</state-manager>
     </application>
    


    fileUpload.xhtml (taken from richfaces demo sample)
    <rich:fileUpload fileUploadListener="#{fileUploadBean.listener}"
     maxFilesQuantity="#{fileUploadBean.uploadsAvailable}"
     id="upload"
     immediateUpload="#{fileUploadBean.autoUpload}"
     acceptedTypes="jpg, gif, png, bmp" allowFlash="#{fileUploadBean.useFlash}">
     <a4j:support event="onuploadcomplete" reRender="info" />
     </rich:fileUpload>
    


    FileUploadBean - this listener is never called
     public void listener(UploadEvent event) throws IOException {
     System.out.println("LISTENER CALLED");
     UploadItem item = event.getUploadItem();
     File file = new File();
     file.setLength(item.getData().length);
     file.setName(item.getFileName());
     file.setData(item.getData());
     files.add(file);
     uploadsAvailable--;
     }
    


    The same application works as normal web application.
    Any hints are very appreciated.

    regards
    Stefan


  • 4. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Stefan Tausendpfund Novice

    Hello wesley,

    the getActionUrl is included now in 3.3.3-SNAPSHOT. So I tried it out. The Method is called on rendering but the upload event is still not fired. Is there something missing in my app or bridge?

    thanks
    Stefan

  • 5. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Alexander Smirnov Master

    Yes, that method has been introduced in the RichFaces 3.3.3, but it still does not used by the portletbridge.
    The idea was to create portal-related FileUploadRenderer that provides direct link to Faces Servlet / richfaces filter in that method. To do that, modified method should call ViewHavdler#createActionUrl and then ExternalContext#encodeActionUrl methods with the parameter javax.portlet.faces.DirectLink and its value is true encoded into URL.
    It would be wonderful if you can prototype such renderer and provide it as contribution to our project.

  • 6. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Stefan Tausendpfund Novice

    Hello Alex,

    we use the portletbridge 2.0.0-SNAPSHOT. The getActionUrl will get there the PortletAjaxContext. So an Url for serveResource is generated there:

    RichFacesEchoPortletWindow?action=f&cacheability=PAGE&_jsfBridgeViewId=%2Fpages%2FfileUpload.xhtml&id=%2Ffaces%2Fpages%2FfileUpload.xhtml
    

    This differs to older bridges. There a direct link to the FacesServlet is generated:
    <WebContext>/faces/pages/fileUpload.xhtml?javax.portlet.faces.DirectLink=true
    


    Using the SNAPSHOT bridge the serveResource is called and the facesContext is executed. The parameter _richfaces_upload_file_indicator=true is set in request, but the FileUploadRendererBase#doDecode is not called (and so the storeData and the UploadEvent is not fired).

    Do we really need to make a direct call to the FacesServlet or is there a way to get the serveResource running?

    regards
    Stefan






  • 7. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Alexander Smirnov Master

    ResourceRequest cannot process multipart requests, at least in the standard-compatible way ( jsr says nothing about that ), so servlet request is only legal way to upload files.

  • 8. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Stefan Tausendpfund Novice

    Hello Alex,

     

    today I had a look on the direct FacesServlet call. I changed the URL to <context>/pages/fileUpload.xhtml adding the DirectLink attribute. First of all the call failed as the view could not be restored in RestorePhase. So I switched to client side state saving. Now the client Id's differ because of the portlet namespace prefix and so invokeRoot is not called in AjaxViewRoot. Do you have additional hints here?

     

    regards

      Stefan

  • 9. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Stefan Tausendpfund Novice

    Hello Alexander,

     

    just a short update: I changed the extend from MultipartRequest from HttpServletWrapper to MultipartRequestBase and added there all necessary methods. Also I added a constructor for the ResourceRequest.

    For testing purposes I check in the portletbridge for multipart request in the RichfacesStrategy. If multipart is detected the MultipartRequest is added with ResourceRequest as request attribute. This works fine, the file is uploaded and handled by the MultipartRequest object. I need some additional debugging as there is a missing attribute in the doDecode.

     

    regards

      Stefan

  • 10. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Wesley Hales Master

    Hi Stefan - Sounds like you have made some great progress. Thanks very much for your time on this!

    Can you go ahead and attach a patch to this jira issue https://jira.jboss.org/jira/browse/PBR-134

    I will also take a look and see if this can be added to the next 2.0 release, which I will have tagged this weekend

  • 11. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Stefan Tausendpfund Novice

    Hello Wesley,


    unfortunately my jira user has not enough permission to change or add anything. You can download the diff from here:

    hxxp://80.190.140.117/patch.zip

    Actually the two paramteres javax.portletbridge.STATE_ID and javax.faces.ViewState are not evaluated in multipart request. So the execution of facecontext does not restore the view properly and therefore the upload event is not fired.

     

    regards

      Stefan

  • 12. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Stefan Tausendpfund Novice

    Hello Wesley,

     

    the uploaded patch works now. I needed to wrap the getRequestParameter methods in ResourceRequestExternalContextImpl to get the additional parameters from Multipartrequest.

     

     

    regards

      Stefan

  • 13. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Wesley Hales Master
    Thanks again Stefan, I added the zip to the jira mentioned above.
  • 14. Re: Can't get rich:fileUpload to work (using 2.0.0.A)
    Stefan Tausendpfund Novice

    Hello Wesley,

     

    first of all a Happy New Year and thanks a lot for integrating the patch in portletbridge.

     

    Unfortunately the bridge is not uploaded to the snapshot repository in jboss.

    Also I have some issues getting the upload running with IE-7/8 and allowFlash set to false. The component shows an transfer error although the upload works well. I had some look in JS and found that in FileUpload.js in method onload the IE tries to find the javax.faces.ViewState input element in response. The a4j:log shows that this is included in the response xml. But the findViewState fails to detect this attribut in response xml and prints out the transfer error.

    On firefox the same setting works well. Setting allowFlash to true als works fine in IE too.

     

    reagards

      Stefan

1 2 Previous Next