Open Source Repository

Home /spring/spring-web-3.0.5 | Repository Home


org/springframework/web/multipart/MultipartResolver.java
/*
 * Copyright 2002-2007 the original author or authors.
 *
 * 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.
 */

package org.springframework.web.multipart;

import javax.servlet.http.HttpServletRequest;

/**
 * A strategy interface for multipart file upload resolution in accordance
 * with <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>.
 * Implementations are typically usable both within an application context
 * and standalone.
 *
 <p>There is only one concrete implementation included in Spring,
 * as of Spring 2.5:
 <ul>
 <li>{@link org.springframework.web.multipart.commons.CommonsMultipartResolver} for Jakarta Commons FileUpload
 </ul>
 *
 <p>There is no default resolver implementation used for Spring
 {@link org.springframework.web.servlet.DispatcherServlet DispatcherServlets},
 * as an application might choose to parse its multipart requests itself. To define
 * an implementation, create a bean with the id "multipartResolver" in a
 {@link org.springframework.web.servlet.DispatcherServlet DispatcherServlet's}
 * application context. Such a resolver gets applied to all requests handled
 * by that {@link org.springframework.web.servlet.DispatcherServlet}.
 *
 <p>If a {@link org.springframework.web.servlet.DispatcherServlet} detects
 * a multipart request, it will resolve it via the configured
 {@link org.springframework.web.multipart.MultipartResolver} and pass on a
 * wrapped {@link javax.servlet.http.HttpServletRequest}.
 * Controllers can then cast their given request to the
 {@link org.springframework.web.multipart.MultipartHttpServletRequest}
 * interface, which permits access to any
 {@link org.springframework.web.multipart.MultipartFile MultipartFiles}.
 * Note that this cast is only supported in case of an actual multipart request.
 *
 <pre class="code">
 * public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
 *   MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
 *   MultipartFile multipartFile = multipartRequest.getFile("image");
 *   ...
 * }</pre>
 *
 * Instead of direct access, command or form controllers can register a
 {@link org.springframework.web.multipart.support.ByteArrayMultipartFileEditor}
 * or {@link org.springframework.web.multipart.support.StringMultipartFileEditor}
 * with their data binder, to automatically apply multipart content to command
 * bean properties.
 *
 <p>As an alternative to using a
 {@link org.springframework.web.multipart.MultipartResolver} with a
 {@link org.springframework.web.servlet.DispatcherServlet},
 * a {@link org.springframework.web.multipart.support.MultipartFilter} can be
 * registered in <code>web.xml</code>. It will delegate to a corresponding
 {@link org.springframework.web.multipart.MultipartResolver} bean in the root
 * application context. This is mainly intended for applications that do not
 * use Spring's own web MVC framework.
 *
 <p>Note: There is hardly ever a need to access the
 {@link org.springframework.web.multipart.MultipartResolver} itself
 * from application code. It will simply do its work behind the scenes,
 * making
 {@link org.springframework.web.multipart.MultipartHttpServletRequest MultipartHttpServletRequests}
 * available to controllers.
 *
 @author Juergen Hoeller
 @author Trevor D. Cook
 @since 29.09.2003
 @see MultipartHttpServletRequest
 @see MultipartFile
 @see org.springframework.web.multipart.commons.CommonsMultipartResolver
 @see org.springframework.web.multipart.support.ByteArrayMultipartFileEditor
 @see org.springframework.web.multipart.support.StringMultipartFileEditor
 @see org.springframework.web.servlet.DispatcherServlet
 */
public interface MultipartResolver {

  /**
   * Determine if the given request contains multipart content.
   <p>Will typically check for content type "multipart/form-data", but the actually
   * accepted requests might depend on the capabilities of the resolver implementation.
   @param request the servlet request to be evaluated
   @return whether the request contains multipart content
   */
  boolean isMultipart(HttpServletRequest request);

  /**
   * Parse the given HTTP request into multipart files and parameters,
   * and wrap the request inside a
   {@link org.springframework.web.multipart.MultipartHttpServletRequest} object
   * that provides access to file descriptors and makes contained
   * parameters accessible via the standard ServletRequest methods.
   @param request the servlet request to wrap (must be of a multipart content type)
   @return the wrapped servlet request
   @throws MultipartException if the servlet request is not multipart, or if
   * implementation-specific problems are encountered (such as exceeding file size limits)
   @see MultipartHttpServletRequest#getFile
   @see MultipartHttpServletRequest#getFileNames
   @see MultipartHttpServletRequest#getFileMap
   @see javax.servlet.http.HttpServletRequest#getParameter
   @see javax.servlet.http.HttpServletRequest#getParameterNames
   @see javax.servlet.http.HttpServletRequest#getParameterMap
   */
  MultipartHttpServletRequest resolveMultipart(HttpServletRequest requestthrows MultipartException;

  /**
   * Cleanup any resources used for the multipart handling,
   * like a storage for the uploaded files.
   @param request the request to cleanup resources for
   */
  void cleanupMultipart(MultipartHttpServletRequest request);

}