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]