Does it work with multipart/form-data encoding? It seems to me that this problem is happening before the form is submitted to the servlet container (take a look at the value of "test" in the HTTP request with Content-Type: multipart/form-data in my original post), so the servlet filter wouldn't help, but I could be wrong.

José Gustavo Zagato wrote:

Hi !

        I don't if it will fit into your needs but, to handler UTF-8 I
build a serverlet filter with handles all encode / Decode operations. As
far as I know this approach is not a pure Struts solution but works
really fine !
I didn't test with a upload form like yours, but it’s a shot !

Regards

  José Gustavo Zagato Rosa
System Analyst - Atos Origin
[EMAIL PROTECTED]


-----Original Message-----
From: Paul Barry [mailto:[EMAIL PROTECTED] Sent: terça-feira, 28 de outubro de 2003 12:07
To: [EMAIL PROTECTED]
Subject: Problem with UTF-8 characters in a mutlipart/form-data encoded
form


I am using Struts 1.1 in an application that needs to support the UTF-8
character set. I am using Resin 2.1.10 with character-encoding="UTF-8", and on most of my forms this seems to work
just fine. I am having problems with forms that have to use the multipart/form-data enctype for handling uploading
files. If I print out the value of a text element in an html:form where the enctype is not set at all (which ends up using
application/x-www-form-urlencoded), using UTF-8 characters works fine. This is what I get:


INFO - test.TestAction - The value is: ä

Here is what the actual HTTP request that gets sent to the server looks
like:

--- Start HTTP Request
-----------------------------------------------------
POST /testForm.do HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, */*
Referer: http://pbdesktop/test.do
Accept-Language: en-us
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: pbdesktop
Content-Length: 11
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: SERVER=op; locale=en_US; JSESSIONID=aoUCARQpqsLd

test=%C3%AD
--- End HTTP Request
------------------------------------------------------

But if I modify my html:form to use enctype="multipart/form-data", I get
this:

INFO - test.TestAction - The value is: A¤

And the HTTP request looks like this:

--- Start HTTP Request
-----------------------------------------------------
POST /testForm.do HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, */*
Referer: http://pbdesktop/test.do
Accept-Language: en-us
Content-Type: multipart/form-data;
boundary=---------------------------7d319628600e4
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: pbdesktop
Content-Length: 141
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: SERVER=op; locale=en_US; JSESSIONID=aoUCARQpqsLd

-----------------------------7d319628600e4
Content-Disposition: form-data; name="test"

í
-----------------------------7d319628600e4-
--- End HTTP Request
------------------------------------------------------

It looks as if the character is already messed up before it even gets to
the servlet container. There are messages in the mailing list archive that discuss this problem, but I didn't see a
solution. What is the best way to handle UTF-8 characters in a multipart/form-data encoded form?


Here is the code that I am testing with:

/test/test.jsp:
<%@ taglib uri="WEB-INF/taglib/struts-html.tld" prefix="html" %>
<%@ taglib uri="WEB-INF/taglib/struts-bean.tld" prefix="bean" %>

<html:html>
   <body>
     <html:form action="testForm.do" enctype="multipart/form-data">
       <html:text property="test" />
       <html:submit />
     </html:form>
   </body>
</html:html>

Relavent parts of struts-config.xml:
<struts-config>

   <form-beans>
     <form-bean name="testForm" type="test.TestActionForm" />
   </form-beans>

   <action-mappings>
     <action path="/test" type="org.apache.struts.actions.ForwardAction"
parameter="/test/test.jsp" />
     <action path="/testForm" type="test.TestAction" name="testForm"
input="/test.do" scope="request" />
   </action-mappings>

<controller contentType="text/html;charset=UTF-8" />

<struts-config/>

test.TestAction:
package test;

import javax.servlet.http.*;
import org.apache.commons.logging.*;
import org.apache.struts.action.*;

public class TestAction extends Action {
        private static final Log log =
LogFactory.getLog(TestAction.class);
        
        public ActionForward execute(
                        ActionMapping mapping,
                        ActionForm pform,
                        HttpServletRequest request,
                        HttpServletResponse response)
                        throws Exception {
                TestActionForm form = (TestActionForm)pform;
                log.info("The value is: "+form.getTest());
                return null;
        }
}

test.TestActionForm:
package test;

import org.apache.struts.action.ActionForm;

public class TestActionForm extends ActionForm {
        private String test;
        public String getTest() { return test;  }
        public void setTest(String string) { test = string; }
}


--------------------------------------------------------------------- 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