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]