You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by jo...@apache.org on 2006/06/19 03:42:12 UTC
svn commit: r415229 - in
/jakarta/commons/proper/fileupload/branches/streaming: ./ .settings/
src/java/org/apache/commons/fileupload/
src/java/org/apache/commons/fileupload/portlet/
src/java/org/apache/commons/fileupload/servlet/ src/test/org/apache/co...
Author: jochen
Date: Sun Jun 18 18:42:11 2006
New Revision: 415229
URL: http://svn.apache.org/viewvc?rev=415229&view=rev
Log:
Added docs and some convenience methods for the streaming API.
Added:
jakarta/commons/proper/fileupload/branches/streaming/xdocs/streaming.xml
Modified:
jakarta/commons/proper/fileupload/branches/streaming/.settings/org.eclipse.jdt.core.prefs
jakarta/commons/proper/fileupload/branches/streaming/project.properties
jakarta/commons/proper/fileupload/branches/streaming/project.xml
jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileItemIterator.java
jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileItemStream.java
jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUpload.java
jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadBase.java
jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/StreamUtil.java
jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/portlet/PortletFileUpload.java
jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/servlet/ServletFileUpload.java
jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/DiskFileItemSerializeTest.java
jakarta/commons/proper/fileupload/branches/streaming/xdocs/changes.xml
jakarta/commons/proper/fileupload/branches/streaming/xdocs/index.xml
jakarta/commons/proper/fileupload/branches/streaming/xdocs/navigation.xml
jakarta/commons/proper/fileupload/branches/streaming/xdocs/using.xml
Modified: jakarta/commons/proper/fileupload/branches/streaming/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/.settings/org.eclipse.jdt.core.prefs?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/.settings/org.eclipse.jdt.core.prefs (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/.settings/org.eclipse.jdt.core.prefs Sun Jun 18 18:42:11 2006
@@ -1,4 +1,4 @@
-#Sun Jun 18 22:37:19 CEST 2006
+#Mon Jun 19 03:18:34 CEST 2006
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.1
@@ -11,7 +11,7 @@
org.eclipse.jdt.core.compiler.problem.assertIdentifier=ignore
org.eclipse.jdt.core.compiler.problem.enumIdentifier=ignore
org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
Modified: jakarta/commons/proper/fileupload/branches/streaming/project.properties
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/project.properties?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/project.properties (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/project.properties Sun Jun 18 18:42:11 2006
@@ -44,7 +44,7 @@
maven.changelog.type=date
#maven.changelog.date=lastRelease
-maven.changelog.date=2005-12-24
+maven.changelog.date=2006-06-08
# documentation properties
maven.xdoc.date=left
Modified: jakarta/commons/proper/fileupload/branches/streaming/project.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/project.xml?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/project.xml (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/project.xml Sun Jun 18 18:42:11 2006
@@ -21,7 +21,7 @@
<name>FileUpload</name>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
- <currentVersion>1.1.1</currentVersion>
+ <currentVersion>1.2-SNAPSHOT</currentVersion>
<inceptionYear>2002</inceptionYear>
<shortDescription>File upload component for Java servlets</shortDescription>
<description>
Modified: jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileItemIterator.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileItemIterator.java?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileItemIterator.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileItemIterator.java Sun Jun 18 18:42:11 2006
@@ -15,10 +15,12 @@
*/
package org.apache.commons.fileupload;
+import java.util.NoSuchElementException;
+
/**
* An iterator, as returned by
- * {@link FileUploadBase#getItemRequest(RequestContext)}
+ * {@link FileUploadBase#getItemIterator(RequestContext)}
*/
public interface FileItemIterator {
/**
Modified: jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileItemStream.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileItemStream.java?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileItemStream.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileItemStream.java Sun Jun 18 18:42:11 2006
@@ -26,7 +26,7 @@
* The items contents are retrieved by calling {@link #openStream()}.</p>
* <p>Instances of this class are created by accessing the
* iterator, returned by
- * {@link FileUploadBase#getRequestIterator(RequestContext)}.</p>
+ * {@link FileUploadBase#getItemIterator(RequestContext)}.</p>
* <em>Note</em>: There is an interaction between the iterator and
* its associated instances of {@link FileItemStream}: By invoking
* {@link Iterator#hasNext()} on the iterator, you discard all data,
Modified: jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUpload.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUpload.java?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUpload.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUpload.java Sun Jun 18 18:42:11 2006
@@ -15,6 +15,8 @@
*/
package org.apache.commons.fileupload;
+import javax.servlet.http.HttpServletRequest;
+
/**
* <p>High level API for processing file uploads.</p>
*
Modified: jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadBase.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadBase.java?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadBase.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/FileUploadBase.java Sun Jun 18 18:42:11 2006
@@ -18,11 +18,9 @@
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
@@ -285,7 +283,7 @@
* @throws FileUploadException if there are problems reading/parsing
* the request or storing files.
*/
- public FileItemIterator getItemRequest(RequestContext ctx)
+ public FileItemIterator getItemIterator(RequestContext ctx)
throws FileUploadException {
return new FileItemIteratorImpl(ctx);
}
@@ -304,7 +302,7 @@
*/
public List /* FileItem */ parseRequest(RequestContext ctx)
throws FileUploadException {
- FileItemIterator iter = getItemRequest(ctx);
+ FileItemIterator iter = getItemIterator(ctx);
List items = new ArrayList();
FileItemFactory fac = getFileItemFactory();
final byte[] buffer = new byte[8192];
@@ -497,7 +495,7 @@
/**
* The iterator, which is returned by
- * {@link FileUploadBase#getRequestIterator(RequestContext)}.
+ * {@link FileUploadBase#getItemIterator(RequestContext)}.
*/
private class FileItemIteratorImpl implements FileItemIterator {
private class FileItemStreamImpl implements FileItemStream {
@@ -773,6 +771,8 @@
*/
public static class InvalidContentTypeException
extends FileUploadException {
+ private static final long serialVersionUID = -9073026332015646668L;
+
/**
* Constructs a <code>InvalidContentTypeException</code> with no
* detail message.
@@ -798,6 +798,8 @@
*/
public static class SizeLimitExceededException
extends FileUploadException {
+ private static final long serialVersionUID = -2474893167098052828L;
+
/**
* The actual size of the request.
*/
Modified: jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/StreamUtil.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/StreamUtil.java?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/StreamUtil.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/StreamUtil.java Sun Jun 18 18:42:11 2006
@@ -1,5 +1,6 @@
package org.apache.commons.fileupload;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -96,5 +97,32 @@
}
}
}
+ }
+
+ /**
+ * This convenience method allows to read a {@link FileItemStream}'s
+ * content into a string. The platform's default character encoding
+ * is used for converting bytes into characters.
+ * @param pStream The input stream to read.
+ * @see #asString(InputStream, String)
+ */
+ public String asString(InputStream pStream) throws IOException {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ copy(pStream, baos, true);
+ return baos.toString();
+ }
+
+ /**
+ * This convenience method allows to read a {@link FileItemStream}'s
+ * content into a string, using the given character encoding.
+ * @param pStream The input stream to read.
+ * @param pEncoding The character encoding, typically "UTF-8".
+ * @see #asString(InputStream)
+ */
+ public String asString(InputStream pStream, String pEncoding)
+ throws IOException {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ copy(pStream, baos, true);
+ return baos.toString(pEncoding);
}
}
Modified: jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/portlet/PortletFileUpload.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/portlet/PortletFileUpload.java?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/portlet/PortletFileUpload.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/portlet/PortletFileUpload.java Sun Jun 18 18:42:11 2006
@@ -16,8 +16,12 @@
package org.apache.commons.fileupload.portlet;
import java.util.List;
+
import javax.portlet.ActionRequest;
+import javax.servlet.http.HttpServletRequest;
+
import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
@@ -111,5 +115,22 @@
public List /* FileItem */ parseRequest(ActionRequest request)
throws FileUploadException {
return parseRequest(new PortletRequestContext(request));
+ }
+
+ /**
+ * Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>
+ * compliant <code>multipart/form-data</code> stream.
+ *
+ * @param request The portlet request to be parsed.
+ *
+ * @return An iterator to instances of <code>FileItemStream</code>
+ * parsed from the request, in the order that they were
+ * transmitted.
+ *
+ * @throws FileUploadException if there are problems reading/parsing
+ * the request or storing files.
+ */
+ public FileItemIterator getItemIterator(ActionRequest request) throws FileUploadException {
+ return super.getItemIterator(new PortletRequestContext(request));
}
}
Modified: jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/servlet/ServletFileUpload.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/servlet/ServletFileUpload.java?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/servlet/ServletFileUpload.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/java/org/apache/commons/fileupload/servlet/ServletFileUpload.java Sun Jun 18 18:42:11 2006
@@ -16,8 +16,11 @@
package org.apache.commons.fileupload.servlet;
import java.util.List;
+
import javax.servlet.http.HttpServletRequest;
+
import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
@@ -114,5 +117,23 @@
public List /* FileItem */ parseRequest(HttpServletRequest request)
throws FileUploadException {
return parseRequest(new ServletRequestContext(request));
+ }
+
+
+ /**
+ * Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>
+ * compliant <code>multipart/form-data</code> stream.
+ *
+ * @param request The servlet request to be parsed.
+ *
+ * @return An iterator to instances of <code>FileItemStream</code>
+ * parsed from the request, in the order that they were
+ * transmitted.
+ *
+ * @throws FileUploadException if there are problems reading/parsing
+ * the request or storing files.
+ */
+ public FileItemIterator getItemIterator(HttpServletRequest request) throws FileUploadException {
+ return super.getItemIterator(new ServletRequestContext(request));
}
}
Modified: jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/DiskFileItemSerializeTest.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/DiskFileItemSerializeTest.java?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/DiskFileItemSerializeTest.java (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/src/test/org/apache/commons/fileupload/DiskFileItemSerializeTest.java Sun Jun 18 18:42:11 2006
@@ -31,7 +31,7 @@
/**
* Serialization Unit tests for
- * {@link org.apache.commons.fileupload.disk.DiskFileItemTest}.
+ * {@link org.apache.commons.fileupload.disk.DiskFileItem}.
*/
public class DiskFileItemSerializeTest extends TestCase
{
Modified: jakarta/commons/proper/fileupload/branches/streaming/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/xdocs/changes.xml?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/xdocs/changes.xml (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/xdocs/changes.xml Sun Jun 18 18:42:11 2006
@@ -45,6 +45,12 @@
<action dev="jochen" type="update" issue="FILEUPLOAD-109">
Eliminated duplicate code.
</action>
+ <action dev="jochen" type="add" issue="FILEUPLOAD-112">
+ Added a streaming API.
+ </action>
+ <action dev="jochen" type="fix" issue="FILEUPLOAD-93">
+ Eliminated the necessity of a content-length header.
+ </action>
</release>
Modified: jakarta/commons/proper/fileupload/branches/streaming/xdocs/index.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/xdocs/index.xml?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/xdocs/index.xml (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/xdocs/index.xml Sun Jun 18 18:42:11 2006
@@ -45,6 +45,7 @@
The following documentation is available:
<ul>
<li><a href="using.html">User Guide</a></li>
+ <li><a href="streaming.html">Streaming API</a></li>
<li><a href="faq.html">Frequently Asked Questions</a></li>
<li><a href="apidocs/index.html">JavaDoc API</a></li>
<li><a href="maven-reports.html">Project Reports</a></li>
Modified: jakarta/commons/proper/fileupload/branches/streaming/xdocs/navigation.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/xdocs/navigation.xml?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/xdocs/navigation.xml (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/xdocs/navigation.xml Sun Jun 18 18:42:11 2006
@@ -31,6 +31,7 @@
<menu name="Commons FileUpload">
<item name="Overview" href="/index.html"/>
<item name="User guide" href="/using.html"/>
+ <item name="Streaming API" href="/streaming.html"/>
<!--item name="Customization" href="/customizing.html"/-->
<item name="FAQ" href="/faq.html"/>
<item name="Javadoc" href="apidocs/index.html"/>
Added: jakarta/commons/proper/fileupload/branches/streaming/xdocs/streaming.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/xdocs/streaming.xml?rev=415229&view=auto
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/xdocs/streaming.xml (added)
+++ jakarta/commons/proper/fileupload/branches/streaming/xdocs/streaming.xml Sun Jun 18 18:42:11 2006
@@ -0,0 +1,87 @@
+<?xml version="1.0"?>
+<!--
+ Copyright 2006 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<document>
+
+ <properties>
+ <title>The Streaming API</title>
+ </properties>
+
+<body>
+
+ <section name="Why Streaming?">
+ <p>
+ The traditional API, which is described in the <a href="using.html">User
+ Guide</a>, assumes, that file items must be stored somewhere, before
+ they are actually accessable by the user. This approach is convenient,
+ because it allows easy access to an items contents. On the other hand,
+ it is memory and time consuming.
+ </p>
+ <p>
+ The streaming API allows you to trade a little bit of convenience for
+ optimal performance and and a low memory profile. Additionally, the
+ API is more lightweight, thus easier to understand.
+ </p>
+ </section>
+
+ <section name="How it works">
+ <p>
+ Again, the <code>FileUpload</code> class is used for accessing the
+ form fields and fields in the order, in which they have been sent
+ by the client. However, the <code>FileItemFactory</code> is completely
+ ignored.
+ </p>
+ </section>
+
+ <section name="Parsing the request">
+ <p>
+ First of all, do not forget to ensure, that a request actually is a
+ a file upload request. This is typically done using the same static
+ method, which you already know from the traditional API.
+ </p>
+<source><![CDATA[// Check that we have a file upload request
+boolean isMultipart = ServletFileUpload.isMultipartContent(request);]]></source>
+ <p>
+ Now we are ready to parse the request into its constituent items. Here's
+ how we do it:
+ </p>
+<source><![CDATA[
+// Create a new file upload handler
+ServletFileUpload upload = new ServletFileUpload();
+
+// Parse the request
+FileItemIterator iter = upload.getItemIterator(request);
+while (iter.hasNext()) {
+ FileItemStream item = iter.next();
+ String name = item.getFieldName();
+ InputStream stream = item.openStream();
+ if (item.isFormField()) {
+ System.out.println("Form field " + name + " with value "
+ + StreamUtil.asString(stream) + " detected.");
+ } else {
+ System.out.println("File field " + name + " with file name "
+ + item.getName() + " detected.");
+ // Process the input stream
+ ...
+ }
+}]]></source>
+ <p>
+ That's all that's needed. Really!
+ </p>
+ </section>
+</body>
+</document>
Modified: jakarta/commons/proper/fileupload/branches/streaming/xdocs/using.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/branches/streaming/xdocs/using.xml?rev=415229&r1=415228&r2=415229&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/branches/streaming/xdocs/using.xml (original)
+++ jakarta/commons/proper/fileupload/branches/streaming/xdocs/using.xml Sun Jun 18 18:42:11 2006
@@ -52,6 +52,12 @@
regardless of its underlying implementation.
</p>
<p>
+ This page describes the traditional API of the commons fileupload
+ library. The traditional API is a convenient approach. However, for
+ ultimate performance, you might prefer the faster
+ <a href="streaming.html">Streaming API</a>.
+ </p>
+ <p>
Each file item has a number of properties that might be of interest for
your application. For example, every item has a name and a content type,
and can provide an <code>InputStream</code> to access its data. On the
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org