    001    /*
    002     * Licensed to the Apache Software Foundation (ASF) under one or more
    003     * contributor license agreements.  See the NOTICE file distributed with
    004     * this work for additional information regarding copyright ownership.
    005     * The ASF licenses this file to You under the Apache License, Version 2.0
    006     * (the "License"); you may not use this file except in compliance with
    007     * the License.  You may obtain a copy of the License at
    008     *
    009     *      http://www.apache.org/licenses/LICENSE-2.0
    010     *
    011     * Unless required by applicable law or agreed to in writing, software
    012     * distributed under the License is distributed on an "AS IS" BASIS,
    013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014     * See the License for the specific language governing permissions and
    015     * limitations under the License.
    016     */
    017    package org.apache.commons.fileupload.servlet;
    018
    019    import java.io.IOException;
    020    import java.util.List;
    021
    022    import javax.servlet.http.HttpServletRequest;
    023
    024    import org.apache.commons.fileupload.FileItemFactory;
    025    import org.apache.commons.fileupload.FileItemIterator;
    026    import org.apache.commons.fileupload.FileUpload;
    027    import org.apache.commons.fileupload.FileUploadException;
    028
    029    /**
    030     * <p>High level API for processing file uploads.</p>
    031     *
    032     * <p>This class handles multiple files per single HTML widget, sent using
    033     * <code>multipart/mixed</code> encoding type, as specified by
    034     * <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>.  Use {@link
    035     * #parseRequest(HttpServletRequest)} to acquire a list of {@link
    036     * org.apache.commons.fileupload.FileItem}s associated with a given HTML
    037     * widget.</p>
    038     *
    039     * <p>How the data for individual parts is stored is determined by the factory
    040     * used to create them; a given part may be in memory, on disk, or somewhere
    041     * else.</p>
    042     *
    043     * @author <a href="mailto:Rafal.Krzewski@e-point.pl">Rafal Krzewski</a>
    044     * @author <a href="mailto:dlr@collab.net">Daniel Rall</a>
    045     * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
    046     * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
    047     * @author <a href="mailto:martinc@apache.org">Martin Cooper</a>
    048     * @author Sean C. Sullivan
    049     *
    050     * @version $Id: ServletFileUpload.java 479484 2006-11-27 01:06:53Z jochen $
    051     */
    052    public class ServletFileUpload extends FileUpload {
    053
    054        // ---------------------------------------------------------- Class methods
    055
    056
    057        /**
    058         * Utility method that determines whether the request contains multipart
    059         * content.
    060         *
    061         * @param request The servlet request to be evaluated. Must be non-null.
    062         *
    063         * @return <code>true</code> if the request is multipart;
    064         *         <code>false</code> otherwise.
    065         */
    066        public static final boolean isMultipartContent(
    067                HttpServletRequest request) {
    068            if (!"post".equals(request.getMethod().toLowerCase())) {
    069                return false;
    070            }
    071            String contentType = request.getContentType();
    072            if (contentType == null) {
    073                return false;
    074            }
    075            if (contentType.toLowerCase().startsWith(MULTIPART)) {
    076                return true;
    077            }
    078            return false;
    079        }
    080
    081
    082        // ----------------------------------------------------------- Constructors
    083
    084
    085        /**
    086         * Constructs an uninitialised instance of this class. A factory must be
    087         * configured, using <code>setFileItemFactory()</code>, before attempting
    088         * to parse requests.
    089         *
    090         * @see FileUpload#FileUpload(FileItemFactory)
    091         */
    092        public ServletFileUpload() {
    093            super();
    094        }
    095
    096
    097        /**
    098         * Constructs an instance of this class which uses the supplied factory to
    099         * create <code>FileItem</code> instances.
    100         *
    101         * @see FileUpload#FileUpload()
    102         * @param fileItemFactory The factory to use for creating file items.
    103         */
    104        public ServletFileUpload(FileItemFactory fileItemFactory) {
    105            super(fileItemFactory);
    106        }
    107
    108
    109        // --------------------------------------------------------- Public methods
    110
    111
    112        /**
    113         * Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>
    114         * compliant <code>multipart/form-data</code> stream.
    115         *
    116         * @param request The servlet request to be parsed.
    117         *
    118         * @return A list of <code>FileItem</code> instances parsed from the
    119         *         request, in the order that they were transmitted.
    120         *
    121         * @throws FileUploadException if there are problems reading/parsing
    122         *                             the request or storing files.
    123         */
    124        public List /* FileItem */ parseRequest(HttpServletRequest request)
    125        throws FileUploadException {
    126            return parseRequest(new ServletRequestContext(request));
    127        }
    128
    129
    130        /**
    131         * Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>
    132         * compliant <code>multipart/form-data</code> stream.
    133         *
    134         * @param request The servlet request to be parsed.
    135         *
    136         * @return An iterator to instances of <code>FileItemStream</code>
    137         *         parsed from the request, in the order that they were
    138         *         transmitted.
    139         *
    140         * @throws FileUploadException if there are problems reading/parsing
    141         *                             the request or storing files.
    142         * @throws IOException An I/O error occurred. This may be a network
    143         *   error while communicating with the client or a problem while
    144         *   storing the uploaded content.
    145         */
    146        public FileItemIterator getItemIterator(HttpServletRequest request)
    147        throws FileUploadException, IOException {
    148            return super.getItemIterator(new ServletRequestContext(request));
    149        }
    150    }