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]