/* * 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 request) throws 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); }