org.springframework.web.multipart.cos.CosMultipartHttpServletRequest Maven / Gradle / Ivy
/*
* Copyright 2002-2006 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.cos;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.oreilly.servlet.MultipartRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.AbstractMultipartHttpServletRequest;
/**
* MultipartHttpServletRequest implementation for Jason Hunter's COS.
* Wraps a COS MultipartRequest with Spring MultipartFile instances.
*
* Not intended for direct application usage. Application code can cast
* to this implementation to access the underlying COS MultipartRequest,
* if it ever needs to.
*
* @author Juergen Hoeller
* @since 06.10.2003
* @see CosMultipartResolver
* @see com.oreilly.servlet.MultipartRequest
*/
public class CosMultipartHttpServletRequest extends AbstractMultipartHttpServletRequest {
protected static final Log logger = LogFactory.getLog(CosMultipartHttpServletRequest.class);
private final MultipartRequest multipartRequest;
/**
* Wrap the given HttpServletRequest in a MultipartHttpServletRequest.
* @param request the servlet request to wrap
* @param multipartRequest the COS multipart request to wrap
*/
protected CosMultipartHttpServletRequest(HttpServletRequest request, MultipartRequest multipartRequest) {
super(request);
this.multipartRequest = multipartRequest;
setMultipartFiles(initFileMap(multipartRequest));
}
/**
* Return the underlying com.oreilly.servlet.MultipartRequest
* instance. There is hardly any need to access this.
*/
public MultipartRequest getMultipartRequest() {
return multipartRequest;
}
/**
* Initialize a Map with file name Strings as keys and
* CosMultipartFile instances as values.
* @param multipartRequest the COS multipart request
* to get the multipart file data from
* @return the Map with CosMultipartFile values
*/
private Map initFileMap(MultipartRequest multipartRequest) {
Map files = new HashMap();
Enumeration fileNames = multipartRequest.getFileNames();
while (fileNames.hasMoreElements()) {
String fileName = (String) fileNames.nextElement();
files.put(fileName, new CosMultipartFile(fileName));
}
return files;
}
public Enumeration getParameterNames() {
return this.multipartRequest.getParameterNames();
}
public String getParameter(String name) {
return this.multipartRequest.getParameter(name);
}
public String[] getParameterValues(String name) {
return this.multipartRequest.getParameterValues(name);
}
public Map getParameterMap() {
Map params = new HashMap();
Enumeration names = getParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
params.put(name, getParameterValues(name));
}
return Collections.unmodifiableMap(params);
}
/**
* Implementation of Spring's MultipartFile interface on top
* of a COS MultipartRequest object.
*/
private class CosMultipartFile implements MultipartFile {
private final String name;
private final File file;
private final long size;
public CosMultipartFile(String name) {
this.name = name;
this.file = multipartRequest.getFile(this.name);
this.size = (this.file != null ? this.file.length() : 0);
}
public String getName() {
return name;
}
public String getOriginalFilename() {
String filename = multipartRequest.getOriginalFileName(this.name);
return (filename != null ? filename : "");
}
public String getContentType() {
return multipartRequest.getContentType(this.name);
}
public boolean isEmpty() {
return (this.size == 0);
}
public long getSize() {
return this.size;
}
public byte[] getBytes() throws IOException {
if (this.file != null && !this.file.exists()) {
throw new IllegalStateException("File has been moved - cannot be read again");
}
return (this.size > 0 ? FileCopyUtils.copyToByteArray(this.file) : new byte[0]);
}
public InputStream getInputStream() throws IOException {
if (this.file != null && !this.file.exists()) {
throw new IllegalStateException("File has been moved - cannot be read again");
}
if (this.size != 0) {
return new FileInputStream(this.file);
}
else {
return new ByteArrayInputStream(new byte[0]);
}
}
public void transferTo(File dest) throws IOException, IllegalStateException {
if (this.file != null && !this.file.exists()) {
throw new IllegalStateException("File has already been moved - cannot be transferred again");
}
if (dest.exists() && !dest.delete()) {
throw new IOException(
"Destination file [" + dest.getAbsolutePath() + "] already exists and could not be deleted");
}
boolean moved = false;
if (this.file != null) {
moved = this.file.renameTo(dest);
if (!moved) {
FileCopyUtils.copy(this.file, dest);
}
}
else {
dest.createNewFile();
}
if (logger.isDebugEnabled()) {
logger.debug("Multipart file '" + getName() + "' with original filename [" +
getOriginalFilename() + "], stored " +
(this.file != null ? "at [" + this.file.getAbsolutePath() + "]" : "in memory") +
": " + (moved ? "moved" : "copied") + " to [" + dest.getAbsolutePath() + "]");
}
}
}
}