<!--
   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>Proposal for FileUpload Package</title>
</head>
<body bgcolor="white">

<div align="center">
<h1>Proposal for <em>FileUpload</em> Package</h1>
</div>

<h3>(0) Rationale</h3>

<p>The javax.servlet package lacks support for rfc 1867, html file upload.  
This package provides a simple to use api for working with such data.
</p>


<h3>(1) Scope of the Package</h3>

<p>This proposal is to create a package of Java utility classes to read 
multipart/form-data within a javax.servlet.http.HttpServletRequest</p>


<h3>(1.5) Interaction With Other Packages</h3>

<p><em>FileUpload</em> relies on standard JDK 1.2 (or later), 
Servlet 2.1 (or later), and the JavaBeans Activation Framework  APIs 
for production deployment.  It will utilize 
the JUnit unit testing framework for developing and executing unit tests, but 
this is of interest only to developers of the component.</p>

<p>No external configuration files are utilized.</p>


<h3>(2) Initial Source of the Package</h3>

<p>The initial classes came from Turbine.</p>

<p>The proposed package name for the new component is
<code>org.apache.commons.fileupload</code>.</p>


<h3>(3)  Required Jakarta-Commons Resources</h3>

<ul>
<li>CVS Repository - New directory <code>fileupload</code> in the
    <code>jakarta-commons</code> CVS repository.</li>
<li>Mailing List - Discussions will take place on the general
    <em>commons-dev@jakarta.apache.org</em> mailing list.  To help
    list subscribers identify messages of interest, it is suggested that
    the message subject of messages about this component be prefixed with
    [FileUpload].</li>
<li>Bugzilla - New component "FileUpload" under the "Commons" product
    category, with appropriate version identifiers as needed.</li>
<li>Jyve FAQ - New category "commons-fileupload" (when available).</li>
</ul>


<h3>(4) Initial Committers</h3>

<p>The initial committers on the FileUpload component shall be as follows:
<ul>
<li>John McNally (jmcnally)</li>
<li>Daniel Rall (dlr)</li>
<li>Jason van Zyl (jvanzyl)</li>
<!-- Add your real name and user name here -->
</ul>
</p>

</body>
</html>
