文件上传增加样例和摘要业务文件的的总文件大小、单个文件大小、文件类型校验
This commit is contained in:
161
src/main/java/com/nis/interceptor/MultipartFileIntercepter.java
Normal file
161
src/main/java/com/nis/interceptor/MultipartFileIntercepter.java
Normal file
@@ -0,0 +1,161 @@
|
||||
package com.nis.interceptor;
|
||||
|
||||
|
||||
import static java.lang.String.format;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.apache.commons.fileupload.FileUpload;
|
||||
import org.apache.commons.fileupload.FileUploadBase;
|
||||
import org.apache.commons.fileupload.FileUploadException;
|
||||
import org.apache.commons.fileupload.UploadContext;
|
||||
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
|
||||
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.util.MultiValueMap;
|
||||
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.CommonsMultipartResolver;
|
||||
|
||||
import com.nis.exceptions.MultiPartNewException;
|
||||
import com.nis.util.Configurations;
|
||||
import com.nis.util.Constants;
|
||||
import com.nis.util.FileUtils;
|
||||
|
||||
|
||||
public class MultipartFileIntercepter extends CommonsMultipartResolver{
|
||||
Logger logger = Logger.getLogger(MultipartFileIntercepter.class);
|
||||
|
||||
|
||||
protected CommonsFileUploadSupport.MultipartParsingResult parseRequest(HttpServletRequest request)throws MultipartException{
|
||||
String encoding = determineEncoding(request);
|
||||
//是否是样例文件
|
||||
boolean isSampleFileUpload = request.getRequestURI().contains(Constants.SAMPLE_UPLOAD_URL_KEYWORD);
|
||||
FileUpload fileUpload = this.prepareFileUpload(encoding,isSampleFileUpload);
|
||||
long fileUploadTotalSize=0l;
|
||||
Properties languageProp=getMsgProp();
|
||||
try {
|
||||
/*****************预先获取上传文件的总的大小************/
|
||||
FileUpload fileUploadTotal = fileUpload;
|
||||
|
||||
ServletRequestContext ctx = new ServletRequestContext(request);
|
||||
InputStream input=ctx.getInputStream();
|
||||
@SuppressWarnings("deprecation") // still has to be backward compatible
|
||||
int contentLengthInt = ctx.getContentLength();
|
||||
|
||||
fileUploadTotalSize = UploadContext.class.isAssignableFrom(input.getClass())
|
||||
// Inline conditional is OK here CHECKSTYLE:OFF
|
||||
? ((UploadContext) ctx).contentLength()
|
||||
: contentLengthInt;
|
||||
// CHECKSTYLE:ON
|
||||
logger.error("上传文件总大小为"+fileUploadTotalSize);
|
||||
/*****************预先获取上传文件的总的大小************/
|
||||
//验证文件总大小
|
||||
if(fileUploadTotalSize > fileUpload.getSizeMax()){
|
||||
throw new MultiPartNewException("", fileUploadTotalSize, fileUpload.getSizeMax(),languageProp, null);
|
||||
}
|
||||
//设置文件上传SizeMax为总文件的大小,否则无法通过SizeLimit(总的文件大小)校验,就无法进行下面单个文件大小的校验
|
||||
fileUploadTotal.setSizeMax(fileUploadTotalSize);
|
||||
|
||||
List fileItems = ((ServletFileUpload) fileUploadTotal).parseRequest(request);
|
||||
MultipartParsingResult multipartParsingResult=parseFileItems(fileItems, encoding);
|
||||
MultiValueMap<String, MultipartFile> files=multipartParsingResult.getMultipartFiles();
|
||||
//单个文件验证文件格式和文件大小
|
||||
validFileList(files,fileUpload,languageProp,isSampleFileUpload);
|
||||
|
||||
return multipartParsingResult;
|
||||
|
||||
} catch (FileUploadBase.SizeLimitExceededException ex) {
|
||||
throw new MultiPartNewException("",fileUploadTotalSize,fileUpload.getSizeMax(),languageProp,ex);
|
||||
} catch (FileUploadException ex) {
|
||||
throw new MultiPartNewException(languageProp, ex);
|
||||
}catch (IOException ex) {
|
||||
throw new MultiPartNewException(languageProp, ex);
|
||||
}catch (MultiPartNewException ex) {
|
||||
throw ex;
|
||||
}catch (Exception ex) {
|
||||
throw new MultiPartNewException(languageProp, ex);
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* 校验文件大小、类型
|
||||
* @return
|
||||
* @throws FileSizeLimitExceededException
|
||||
*/
|
||||
protected void validFileList(MultiValueMap<String, MultipartFile> multipartFile,FileUpload fileUpload,Properties prop,boolean isSampleFileUpload) throws FileSizeLimitExceededException{
|
||||
String errorInfo="";
|
||||
|
||||
String fileType="";
|
||||
long fileMaxSize=0l;
|
||||
if(isSampleFileUpload){
|
||||
fileType=Constants.SAMPLE_FILE_TYPE;
|
||||
fileMaxSize=Constants.SAMPLE_SINGLE_FILE_MAX_SIZE;
|
||||
}else{
|
||||
fileType=Constants.DIGEST_FILE_TYPE;
|
||||
fileMaxSize=Constants.DIGEST_SINGLE_FILE_MAX_SIZE;
|
||||
}
|
||||
for (String fileName : multipartFile.keySet()) {
|
||||
MultipartFile file= multipartFile.getFirst(fileName);
|
||||
//文件类型错误
|
||||
if(fileType.indexOf(","+FileUtils.getSuffix(file.getOriginalFilename(), false)+",") == -1){
|
||||
throw new MultiPartNewException(errorInfo,file.getOriginalFilename(),fileType.substring(0,fileType.length()-1).substring(1),prop,null);
|
||||
}
|
||||
if(file.getSize() > fileMaxSize){
|
||||
throw new MultiPartNewException(errorInfo, file.getOriginalFilename(), file.getSize(), fileMaxSize,prop, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 构造FileUpload
|
||||
* @param encoding
|
||||
* @param isSampleFileUpload
|
||||
* @return
|
||||
*/
|
||||
protected FileUpload prepareFileUpload(String encoding,boolean isSampleFileUpload) {
|
||||
FileUpload fileUpload = getFileUpload();
|
||||
FileUpload actualFileUpload = fileUpload;
|
||||
if (encoding != null && !encoding.equals(fileUpload.getHeaderEncoding())) {
|
||||
actualFileUpload = newFileUpload(getFileItemFactory());
|
||||
actualFileUpload.setHeaderEncoding(encoding);
|
||||
if(isSampleFileUpload){
|
||||
actualFileUpload.setSizeMax(Constants.SAMPLE_TOTAL_FILE_MAX_SIZE);
|
||||
}else{
|
||||
actualFileUpload.setSizeMax(Constants.DIGEST_TOTAL_FILE_MAX_SIZE);
|
||||
}
|
||||
}
|
||||
return actualFileUpload;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取国际化配置文件
|
||||
* @return
|
||||
*/
|
||||
public Properties getMsgProp(){
|
||||
Properties msgProp = new Properties();
|
||||
try {
|
||||
String language = LocaleContextHolder.getLocale().getLanguage();
|
||||
if(language.equals("zh_cn")||language.equals("zh")){
|
||||
msgProp.load(Configurations.class.getResourceAsStream("/messages/message_zh_CN.properties"));
|
||||
}else if(language.equals("ru")){
|
||||
msgProp.load(Configurations.class.getResourceAsStream("/messages/message_ru.properties"));
|
||||
}else{
|
||||
msgProp.load(Configurations.class.getResourceAsStream("/messages/message_en.properties"));
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
msgProp = null;
|
||||
logger.error("未知i18n消息配置文件,请确定文件是否存在!",e);
|
||||
}
|
||||
return msgProp;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user