Looks like you need a MultipartFilter earlier in the Filter Chain than your Filter. That way both your Filter and the Action will get the results. It will bypass Strut's built-in Multipart support, but it should work fine. (I think com.oreilly.servlets has one) (*Chris*)
On 3/27/07, Lance <[EMAIL PROTECTED]> wrote:
My filter is only interested in text parameters, my struts action processes the file parameter. If I parse the request myself (in the filter), the file parameter does not make it through to my action. If I do not parse the request myself, I can not see the parameters in my filter. Hope this clears things up a bit. trad-ex wrote: > Hi Lance, > > Sorry for my misunderstanding your issue. > What I understood is: > > Your Filter class works fine except file parameter. > > Is this correct ? > So, after I looked over your implementation, I found the line below: > > parameterMap = multipartHandler.getTextElements(); > > So, parameterMap has only "normal text parameters" (you called), doesn't > it ? > > Why doesn't you adopt "getAllElements()" ? > But I don't have tested it yet, but if my guess above is right, it does > work. > > Best regards, > trad-ex > > >> 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] >> > > --------------------------------------------------------------------- > 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]