Open Source Repository

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



org/springframework/web/portlet/multipart/PortletMultipartResolver.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.portlet.multipart;

import javax.portlet.ActionRequest;

import org.springframework.web.multipart.MultipartException;

/**
 * Portlet version of Spring's multipart resolution strategy for file uploads
 * as defined in <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>.
 *
 <p>Implementations are typically usable both within any application context
 * and standalone.
 *
 <p>There is one concrete implementation included in Spring:
 <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.portlet.DispatcherPortlet DispatcherPortlets},
 * as an application might choose to parse its multipart requests itself. To
 * define an implementation, create a bean with the id
 {@link org.springframework.web.portlet.DispatcherPortlet#MULTIPART_RESOLVER_BEAN_NAME "portletMultipartResolver"}
 * in a <code>DispatcherPortlet's</code> application context. Such a resolver
 * gets applied to all requests handled by that <code>DispatcherPortlet</code>.
 *
 <p>If a <code>DispatcherPortlet</code> detects a multipart request, it will
 * resolve it via the configured
 {@link org.springframework.web.multipart.MultipartResolver} and pass on a
 * wrapped Portlet {@link ActionRequest}.
 {@link org.springframework.web.portlet.mvc.Controller Controllers} can then
 * cast their given request to the {@link MultipartActionRequest} interface,
 * being able to access <code>MultipartFiles</code>. Note that this cast is
 * only supported in case of an actual multipart request.
 *
 <pre class="code"> public void handleActionRequest(ActionRequest request, ActionResponse response) {
 *   MultipartActionRequest multipartRequest = (MultipartActionRequest) 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>Note: There is hardly ever a need to access the
 <code>MultipartResolver</code> itself from application code. It will simply
 * do its work behind the scenes, making <code>MultipartActionRequests</code>
 * available to controllers.
 *
 @author Juergen Hoeller
 @since 2.0
 @see MultipartActionRequest
 @see org.springframework.web.multipart.MultipartFile
 @see CommonsPortletMultipartResolver
 @see org.springframework.web.multipart.support.ByteArrayMultipartFileEditor
 @see org.springframework.web.multipart.support.StringMultipartFileEditor
 @see org.springframework.web.portlet.DispatcherPortlet
 */
public interface PortletMultipartResolver {

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

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

  /**
   * Cleanup any resources used for the multipart handling,
   * such as storage for any uploaded file(s).
   @param request the request to cleanup resources for
   */
  void cleanupMultipart(MultipartActionRequest request);

}