Hi trad-ex,
In action code, the ActionServlet has already parsed the request for you so request.getParameterMap() magically works. In a filter scenario, the request has not yet been parsed. I have since abondened attempting to filter multipart requests in my filter. Luckily most of our actions extend a common BaseAction and I was able to plug the filtering logic in there. It would have been nice to do it in a filter. I'm still interested if someone else has an answer.

Cheers,
Lance.

trad-ex wrote:
Hi Lance,

Just curious, I implemented multipart request handler using Struts 1.2,
ActionForm and Actoin class ( not using Fileter...) .

like:

protected ActionForward executeAction( ActionMapping mapping , ActionForm form , HttpServletRequest request , HttpServletResponse response )
  {
    ActionErrors errors = new ActionErrors() ;
    HttpSession session = request.getSession() ;

    String contentType = request.getContentType() ;
    if( contentType == null || !contentType.startsWith( "multipart/form-
data" ) )
      return null ;
MultiFilesImportForm multiFilesImportForm = (MultiFilesImportForm) form ; Hashtable multiFormFileTable = multiFilesImportForm.getMultiFilesTable() ;

    ......
** executeAction calls execute internally. My ActionForm ( called MultiFilesImportForm ) is like:

public class MultiFilesImportForm extends ActionForm
{
  public MultiFilesImportForm()
  {
  }
  public Hashtable getAllRequestTable()
  {
    return getMultipartRequestHandler().getAllElements() ;
  }
public Hashtable getMultiFilesTable()
  {
Hashtable fileElements = getMultipartRequestHandler().getFileElements() ;
    Hashtable stringElements = getMultiStringTable() ;
for( Enumeration enumStrKey = stringElements.keys() ; enumStrKey.
hasMoreElements() ; )
      fileElements.remove( enumStrKey.nextElement() ) ;
return fileElements ;
  }
public Hashtable getMultiStringTable()
  {
    Hashtable multiStringTable = new Hashtable() ;
    Hashtable allRequestTable  = getAllRequestTable() ;
for( Enumeration enumKey = allRequestTable.keys() ; enumKey.
hasMoreElements() ; )
    {
      String key  = (String) enumKey.nextElement() ;
      Object elem = allRequestTable.get( key );
if( elem instanceof String )
        multiStringTable.put( key , elem ) ;
    }
return multiStringTable ;
  }
public ActionErrors validate( ActionMapping mapping , HttpServletRequest request )
  {
   .......

Best Regards,
trad-ex


Can someone tell me the best way to deal with multipart parameters in a Filter without affecting struts?

In my filter, request.getParameterMap() returns an empty map because the multipart content has not yet been parsed. I had a look in the struts code and saw references to a MultipartRequestWrapper and a CommonsMultipartRequestHandler. From what I can see, the requestHandler parses the request and calls MultipartRequestWrapper.setParameter().

So... in my filter I do the following:

protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
   boolean isMultipart = isMultipart(request);
   Map parameterMap;
   if (isMultipart) {
// wrap the request so that CommonsMultipartRequestHandler.handleRequest() // can call set parameter. the wrapped request is then passed down the filter chain
       request = new MultipartRequestWrapper(request);
MultipartRequestHandler multipartHandler = new CommonsMultipartRequestHandler(); ModuleConfig moduleConfig = (ModuleConfig) servletContext.getAttribute(Globals.MODULE_KEY);
       request.setAttribute(Globals.MODULE_KEY, moduleConfig);
       multipartHandler.handleRequest(request);
       request.removeAttribute(Globals.MODULE_KEY);
       parameterMap = multipartHandler.getTextElements();
   } else {
       parameterMap = request.getParameterMap();
   }

   // do some stuff with the parameters

   chain.doFilter(request, response);
}

The problem now is that when I upload a file, struts thinks the file is null. request.getParameter() works for normal text parameters on the multipart form. I have also tried parsing the request and sending the non-wrapped request down the chain but struts does not re-parse the request if i do this.

I am using struts 1.3.5

Thanks,
Lance.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to