<?xml version="1.0"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You 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>Fileupload Overview</title>
  <author email="rdonkin@apache.org">Robert Burrell Donkin</author>
 </properties>

<body>

    <section name="Using FileUpload">
      <p>
        Your application should detect whether or not FileUpload should be
        invoked, based on the HTTP method and the content type of the request.
      </p>
      <p>
        Assuming that you have decided that FileUpload should be invoked, you
        might write the following code to handle a file upload request:
<pre>
    // Create a new file upload handler
    DiskFileUpload upload = new DiskFileUpload();

    // Set upload parameters
    upload.setSizeMax(MAX_UPLOAD_SIZE);
    upload.setSizeThreshold(MAX_MEMORY_SIZE);
    upload.setRepositoryPath(TEMP_DIR);

    // Parse the request
    List items = upload.parseRequest(request);

    // Process the uploaded fields
    Iterator iter = items.iterator();
    while (iter.hasNext()) {
        FileItem item = (FileItem) iter.next();

        if (item.isFormField()) {
            processTextParameter(request, item);
        } else {
            processFileParameter(request, item);
        }
    }
</pre>
      </p>
    </section>

</body>
</document>
