diff --git a/src/main/java/com/nis/interceptor/MultipartFileIntercepter.java b/src/main/java/com/nis/interceptor/MultipartFileIntercepter.java index f968223c0..7a7e6b97d 100644 --- a/src/main/java/com/nis/interceptor/MultipartFileIntercepter.java +++ b/src/main/java/com/nis/interceptor/MultipartFileIntercepter.java @@ -5,11 +5,16 @@ import static java.lang.String.format; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Properties; import javax.servlet.http.HttpServletRequest; +import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUpload; import org.apache.commons.fileupload.FileUploadBase; import org.apache.commons.fileupload.FileUploadException; @@ -19,10 +24,14 @@ import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.servlet.ServletRequestContext; import org.apache.log4j.Logger; import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.http.MediaType; +import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartException; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.commons.CommonsFileUploadSupport; +import org.springframework.web.multipart.commons.CommonsMultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartResolver; import com.nis.exceptions.MultiPartNewException; @@ -48,7 +57,6 @@ public class MultipartFileIntercepter extends CommonsMultipartResolver{ if(isSampleFileUpload || isDigestFileUpload){ /*****************预先获取上传文件的总的大小************/ FileUpload fileUploadTotal = fileUpload; - ServletRequestContext ctx = new ServletRequestContext(request); InputStream input=ctx.getInputStream(); @SuppressWarnings("deprecation") // still has to be backward compatible @@ -166,5 +174,66 @@ public class MultipartFileIntercepter extends CommonsMultipartResolver{ } return msgProp; } + protected CommonsFileUploadSupport.MultipartParsingResult parseFileItems(List fileItems, String encoding) { + MultiValueMap multipartFiles = new LinkedMultiValueMap(); + Map multipartParameters = new HashMap(); + Map multipartParameterContentTypes = new HashMap(); + + // Extract multipart files and multipart parameters. + for (FileItem fileItem : fileItems) { + if (fileItem.isFormField()) { + String value; + String partEncoding = determineEncoding(fileItem.getContentType(), encoding); + if (partEncoding != null) { + try { + value = fileItem.getString(partEncoding); + } + catch (UnsupportedEncodingException ex) { + if (logger.isDebugEnabled()) { + logger.warn("Could not decode multipart item '" + fileItem.getFieldName() + + "' with encoding '" + partEncoding + "': using platform default"); + } + value = fileItem.getString(); + } + } + else { + value = fileItem.getString(); + } + String[] curParam = multipartParameters.get(fileItem.getFieldName()); + if (curParam == null) { + // simple form field + multipartParameters.put(fileItem.getFieldName(), new String[] {value}); + } + else { + // array of simple form fields + String[] newParam = StringUtils.addStringToArray(curParam, value); + multipartParameters.put(fileItem.getFieldName(), newParam); + } + multipartParameterContentTypes.put(fileItem.getFieldName(), fileItem.getContentType()); + } + else { + // multipart file field + CommonsMultipartFile file = new CommonsMultipartFile(fileItem); + if(!StringUtils.isEmpty(file.getOriginalFilename())){ + multipartFiles.add(file.getName(), file); + } + if (logger.isDebugEnabled()) { + logger.debug("Found multipart file [" + file.getName() + "] of size " + file.getSize() + + " bytes with original filename [" + file.getOriginalFilename() + "], stored " + + file.getStorageDescription()); + } + } + } + return new MultipartParsingResult(multipartFiles, multipartParameters, multipartParameterContentTypes); + } + + private String determineEncoding(String contentTypeHeader, String defaultEncoding) { + if (!StringUtils.hasText(contentTypeHeader)) { + return defaultEncoding; + } + MediaType contentType = MediaType.parseMediaType(contentTypeHeader); + Charset charset = contentType.getCharSet(); + return (charset != null ? charset.name() : defaultEncoding); + } }