You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by bu...@apache.org on 2004/04/27 09:20:58 UTC
DO NOT REPLY [Bug 28613] New: -
Multipart data corrupts as CommonsMultipartRequestHandler does not set headerEncoding
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=28613>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://issues.apache.org/bugzilla/show_bug.cgi?id=28613
Multipart data corrupts as CommonsMultipartRequestHandler does not set headerEncoding
Summary: Multipart data corrupts as
CommonsMultipartRequestHandler does not set
headerEncoding
Product: Struts
Version: 1.1 Final
Platform: All
OS/Version: Linux
Status: NEW
Severity: Critical
Priority: Other
Component: File Upload
AssignedTo: dev@struts.apache.org
ReportedBy: ianwark@hotmail.com
When the character encoding in the request does not match the default encoding
of the server in which Struts is contained the file upload API is unable to
extract non-ASCII information from the request (e.g. Japanese writing). For
example, inputting a file name into a Windows PC browser (e.g. Windows-31J)
that goes to a Linux (or other UNIX) web server (EUC-JP) with Struts.
Depending on exactly what combination of characters are used for the file name,
the file name may simply become corrupted (garbage string) and then the file
upload takes place normally, or, in a worst case scenario, corrupted
information from the request will continue along until in BeanUtils you get an
IllegalArgumentException from the Reflection API and Struts crashes.
Information extracted prior from the request cannot be set into the Form beans
because the number of parameters are incorrect. This occurs for single byte
kana writing in odd byte combinations at the end of the string (and in some
other instances).
The exception occurs on line 1019 in the BeanUtils.class where the property is
set. (Of course, this problem has nothing to do with BeanUtils). [If someone
wants the stack trace I can reproduce it on my Windows PC using Vmware with
Linux (with some trouble). The encoding in Linux is set to EUC-JP.]
A simple solution to the problem might be the following. Just set the header
encoding to the request character encoding. Below I have added this one line to
the source in CommonsMultipartRequestHandler and this works perfectly. In our
case we set the character encoding to Windows-31J in the JSP.
(extract from CommonsMultipartRequestHandler.java)
// Create and configure a DIskFileUpload instance.
DiskFileUpload upload = new DiskFileUpload();
// Set the maximum size before a FileUploadException will be thrown.
upload.setSizeMax((int) getSizeMax(ac));
// Set the maximum size that will be stored in memory.
upload.setSizeThreshold((int) getSizeThreshold(ac));
// Set the the location for saving data on disk.
upload.setRepositoryPath(getRepositoryPath(ac));
// Set the header encoding to that of the request header
upload.setHeaderEncoding(request.getCharacterEncoding());
// Create the hash tables to be populated.
elementsText = new Hashtable();
elementsFile = new Hashtable();
elementsAll = new Hashtable();
FWIW, this problem has been around a long time. There is even a website in
Japan that offers a workaround for the problem without touching the Struts
source. But the solution the author offers is very complex.
see the multipart filter at the below address
http://kvasir.skirnir.net/software/java/java00015.ksd
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org