<!--
   Copyright 2002-2004 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.
-->
<html>
<head>
<title>Status File for Jakarta Commons "FileUpload" Component</title>
</head>
<body bgcolor="white">


<div align="center">
<h1>The Jakarta Commons <em>FileUpload</em> Component</h1>
$Id$<br />
<a href="#Introduction">[Introduction]</a>
<a href="#Dependencies">[Dependencies]</a>
<a href="#Release Info">[Release Info]</a>
<a href="#Committers">[Committers]</a>
<a href="#Action Items">[Action Items]</a>
<br /><br />
</div>


<a name="Introduction"></a>
<h3>1.  INTRODUCTION</h3>

<p>The <em>FileUpload</em> Component contains a set of Java classes that 
provide helper methods for handling RFC 1867.
The following classes are included:</p>
<ul>
<li><strong>FileUpload</strong> - High-level class for parsing the request.</li>
<li>
  <strong>MultipartStream</strong> - Low-level processing of multipart 
  data streams 
</li>
<li>
  <strong>FileItem</strong> - This interface represents a file received using
  multipart/form-data POST request
</li>
<li><strong>DefaultFileItem</strong> - Implementation of FileItem</li>
<li>
    <strong>FileUploadException</strong> - Exception thrown if processing
    the request data fails.
</li>
</ul>


<a name="Dependencies"></a>
<h3>2.  DEPENDENCIES</h3>

<p>The <em>FileUpload</em> component is dependent upon the following external
components for development and use:</p>
<ul>
<li><a href="http://java.sun.com/j2se">Java Development Kit</a>
    (Version 1.2 or later)</li>
<li><a href="http://java.sun.com/products/servlet/index.html">Java Servlets</a>
    (Version 2.2 or later)</li>
<li><a href="http://www.junit.org">JUnit Testing Framework</a>
    (Version 3.8.1 or later) - for unit tests only, not required
    for deployment</li>
</ul>


<a name="Release Info"></a>
<h3>3.  RELEASE INFO</h3>

<p>Current Release: 1.0 Beta 1</p>

<p>Planned Next Release: 1.0 Beta 2</p>


<a name="Committers"></a>
<h3>4.  COMMITTERS</h3>

<p>The following individuals are the primary developers and maintainers of this
component.  Developers who plan to use <em>FileUpload</em> in their own
projects are encouraged to collaborate on the future development of this
component to ensure that it continues to meet a variety of needs.</p>
<ul>
<li><a href="mailto:jmcnally at apache.org">John McNally</a></li>
<li><a href="mailto:dlr at apache.org">Daniel Rall</a></li>
<li><a href="mailto:jvanzyl at apache.org">Jason van Zyl</a></li>
<li><a href="mailto:martinc at apache.org">Martin Cooper</a></li>
<li><a href="mailto:rdonkin at apache.org">Robert Burrell Donkin</a></li>
</ul>


<a name="Action Items"></a>
<h3>5.  ACTION ITEMS</h3>

<p>The following action items are pending:</p>
<ul>
  <li><b>Additional unit tests</b> to increase code coverage.</li>
  <li><b>Documentation</b> for the customization capabilities.</li>
</ul>

</body>
</html>
