All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.tinygroup.springmvc.multipart.TinyDelegateMultipartResolver Maven / Gradle / Ivy

The newest version!
package org.tinygroup.springmvc.multipart;

import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
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.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest;
import org.tinygroup.weblayer.webcontext.parser.ParserWebContext;
import org.tinygroup.weblayer.webcontext.parser.upload.UploadService;
import org.tinygroup.weblayer.webcontext.util.WebContextUtil;

/**
 * 由于在weblayer中parserfilter可能已经进行文件上传处理,此处将复用之前的处理方式
 * 
 * @author renhui
 *
 */
public class TinyDelegateMultipartResolver extends CommonsMultipartResolver {
	

	@Override
	public MultipartHttpServletRequest resolveMultipart(
			final HttpServletRequest request) throws MultipartException {
		final ParserWebContext parserWebContext = WebContextUtil.findWebContext(
				request, ParserWebContext.class);
		final UploadService uploadService = parserWebContext.getUploadService();
		if (parserWebContext != null && uploadService != null
				&& uploadService.isMultipartContent(request)) {
			return new DefaultMultipartHttpServletRequest(request) {
				@Override
				protected void initializeMultipart() {
					MultipartParsingResult parsingResult = parseRequest(
							request, uploadService,parserWebContext);
					setMultipartFiles(parsingResult.getMultipartFiles());
					setMultipartParameters(parsingResult
							.getMultipartParameters());
				}
			};
		}
		return super.resolveMultipart(request);
	}

	protected MultipartParsingResult parseRequest(HttpServletRequest request,
			UploadService uploadService, ParserWebContext parserWebContext) throws MultipartException {
		String encoding = determineEncoding(request);
		List fileItems = Arrays.asList(parserWebContext.getParameters().getFileItems());
		return parseFileItems(fileItems, encoding,parserWebContext);
	}

	protected MultipartParsingResult parseFileItems(List fileItems,
			String encoding, ParserWebContext parserWebContext) {
		MultiValueMap multipartFiles = new LinkedMultiValueMap();
		Map multipartParameters = new HashMap();

		// Extract multipart files and multipart parameters.
		for (FileItem fileItem : fileItems) {
			if (fileItem.isFormField()) {
				if(!multipartParameters.containsKey(fileItem.getFieldName())){
					Object value=parserWebContext.get(fileItem.getFieldName());
					if(value==null||value instanceof String){
						multipartParameters.put(fileItem.getFieldName(), new String[]{(String)value});
					}else if(value instanceof String[]){
						multipartParameters.put(fileItem.getFieldName(), (String[])value);
					}
				}
			} else {//暂时不支持filter文件过滤功能
				// multipart file field
				DefaultTinyMultipartFile file = new DefaultTinyMultipartFile(
						fileItem);
				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);
	}

	protected 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;
	}

	public void cleanupMultipart(MultipartHttpServletRequest request) {
		ParserWebContext parserWebContext = WebContextUtil.findWebContext(
				request, ParserWebContext.class);
		final UploadService uploadService = parserWebContext.getUploadService();
		if (parserWebContext != null && uploadService != null
				&& !uploadService.isTemporary()) {//非临时目录直接返回
			return;
		}else{
			super.cleanupMultipart(request);
		}
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy