Hi Jason,
Did you create a JIRA issue for this yet along with your use case?
Thanks,
Jeanne
Jason Lee wrote, On 8/23/2011 8:42 AM PT:
I have been trying to get tr:inputFile to work, but I keep getting
EOFExceptions. I traced it down to MultipartFormHandler._skipBoundary(). The
first issue is the EOFException, as noted in the comment, is a horribly
misleading exception. :) The reason the exception was thrown, though, seems to
be a problem with the boundary handling.
In _parseBoundary(), contentType might be passed something like "multipart/form-data;
boundary=---------------------------135858097916243791492128236579;charset=UTF-8". However, when _skipBoundary() is
called, _readLine() returns "-----------------------------135858097916243791492128236579". Note that the first
string has ";charset=UTF-8" at the end, while the second does not. It seems that ExternalContext.getContentType()
appends that for reason (I'm posting from a Facelets page with the encoding set to UTF-8 ("<?xml version='1.0'
encoding='UTF-8' ?>"), so that might be the case.
At any rate, I made the following changes that seems to allow the uploads to
work as expected (as well as throwing what seems to me be a more reasonable
Exception, though it could use i18n help).
Is there a chance we could get this change reviewed and committed? Or perhaps a
better explanation of/fix for what we're seeing?
Thanks! :)
Index:
trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/util/MultipartFormHandler.java
===================================================================
---
trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/util/MultipartFormHandler.java
(revision 1160712)
+++
trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/util/MultipartFormHandler.java
(working copy)
@@ -225,7 +225,7 @@
if (!line.startsWith(_boundary))
{
// A better exception would be nice.
- throw new EOFException();
+ throw new IllegalStateException("Boundary information not found. Unable to
process upload.");
}
}
@@ -388,9 +388,14 @@
{
return null;
}
+ String boundary = contentType.substring(boundaryStart +
_BOUNDARY_PARAMETER.length());
+ final int semicolonIndex = boundary.indexOf(";");
+ if (semicolonIndex > -1) {
+ boundary = boundary.substring(0, semicolonIndex);
+ }
// Boundary always starts with "--"
- return "--" + contentType.substring(boundaryStart +
_BOUNDARY_PARAMETER.length());
+ return "--" + boundary;
}
//Reads the ContentType string out of a line of the incoming request