?
<form id="uploadFile" enctype="multipart/form-data"> <input type="file" multiple="multiple" data-default-file="" data-max-file-size="3M"/> </form>
?Spring如何获取form中上传的文件呢,Servlet3.0之前的版本,和Servlet3.0是有差别的
?
?
请看这段注释
?
/**
* Standard implementation of the {@link MultipartResolver} interface,
* based on the Servlet 3.0 {@link javax.servlet.http.Part} API.
* To be added as "multipartResolver" bean to a Spring DispatcherServlet context,
* without any extra configuration at the bean level (see below).
*
* <p><b>Note:</b> In order to use Servlet 3.0 based multipart parsing,
* you need to mark the affected servlet with a "multipart-config" section in
* {@code web.xml}, or with a {@link javax.servlet.MultipartConfigElement}
* in programmatic servlet registration, or (in case of a custom servlet class)
* possibly with a {@link javax.servlet.annotation.MultipartConfig} annotation
* on your servlet class. Configuration settings such as maximum sizes or
* storage locations need to be applied at that servlet registration level;
* Servlet 3.0 does not allow for them to be set at the MultipartResolver level.
*
* @author Juergen Hoeller
* @since 3.1
*/
?
org.springframework.web.multipart.support.StandardServletMultipartResolver
?Servlet3.0及以后,可以用这个StandardServletMultipartResolver来处理上传文件
?
?
?
org.springframework.web.multipart.commons.CommonsMultipartResolver
?
而3.0之前的版本通常用的是CommonsMultipartResolver来处理
?
这两者有什么区别呢,新版是基于Servlet3.0的API实现的,旧版是基于Apache Commons FileUpload实现的
两者使用的时候配置也是不同的,老版的CommonsMultipartResolver可以在用的时候配置,而新版的StandardServletMultipartResolver必须在注册Servlet的时候就进行配置。
?
?
CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxInMemorySize(maxInMemorySize); resolver.setMaxUploadSize(maxUploadSize); resolver.setDefaultEncoding(defaultEncoding); resolver.setUploadTempDir(uploadTempDir);
?基于Apache Commons FileUpload的CommonsMultipartResolver的相关配置网上有很多
?通常可以在MultipartResolver的级别进行配置
?
?
* In order to use Servlet 3.0 based multipart parsing,
* you need to mark the affected servlet with a "multipart-config" section in
* {@code web.xml}, or with a {@link javax.servlet.MultipartConfigElement}
* in programmatic servlet registration, or (in case of a custom servlet class)
* possibly with a {@link javax.servlet.annotation.MultipartConfig} annotation
* on your servlet class. Configuration settings such as maximum sizes or
* storage locations need to be applied at that servlet registration level;
* Servlet 3.0 does not allow for them to be set at the MultipartResolver level.
?但是基于Servlet3.0的API实现的StandardServletMultipartResolver需要在web.xml或者在配置Servlet的时候进行配置,不允许在MultipartResolver的级别进行配置。
?
你可以在注册Servlet的时候加入一个javax.servlet.MultipartConfigElement来进行配置,或者使用javax.servlet.annotation.MultipartConfig注解在servlet类中进行配置。
?
比如这样:
?
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", dispatcherServlet);
MultipartConfigElement config = new MultipartConfigElement(BaseConst.UPLOAD_FOLDER, 8000L, 8000L, 0);
registration.setMultipartConfig(config);
registration.setLoadOnStartup(1);
registration.addMapping("/");
?配置了上传文件最大不超过8Kb
?
import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.support.StandardServletMultipartResolver;
?
@Bean
public MultipartResolver multipartResolver(){
StandardServletMultipartResolver resolver = new StandardServletMultipartResolver();
return resolver;
}
?配置完后在ApplicationContext中实例化一个StandardServletMultipartResolver就可以了
?
@Service("getUploadFile")
public class GetUploadFile {
@Autowired
private MultipartResolver multipartResolver;
public void handleUploadFile(HttpServletRequest request) {
MultipartHttpServletRequest multipartRequest = multipartResolver.resolveMultipart(request);
multipartRequest.getFileNames().forEachRemaining(name -> {
MultipartFile file = multipartRequest.getFile(name);
file.getInputStream();//do something
file.getBytes();//do something
});
}
}
?这是使用的例子,非常方便,新老版本没什么区别。
?
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartResolver;
@Service("getUploadFile")
public class GetUploadFile<T> implements IGetUploadFile<T> {
@Autowired
private MultipartResolver multipartResolver;
@Override
public List<T> getUploadFile(HttpServletRequest request, IMultipartFileHandler<T> handler) {
MultipartHttpServletRequest multipartRequest = multipartResolver
.resolveMultipart(request);
List<T> uploadFiles = new ArrayList<>();
multipartRequest.getFileNames().forEachRemaining(name -> {
MultipartFile file = multipartRequest.getFile(name);
T entity = handler.handle(file);
uploadFiles.add(entity);
});
return uploadFiles;
}
}
?
import java.util.List;
import javax.servlet.http.HttpServletRequest;
public interface IGetUploadFile<T> {
/**
* get upload files and process
* return the result list
* as the process method being offered: IMultipartFileHandler<T>
* @param request
* @param handler
* @return
*/
public List<T> getUploadFile(HttpServletRequest request, IMultipartFileHandler<T> handler);
}
?
import org.springframework.web.multipart.MultipartFile;
@FunctionalInterface
public interface IMultipartFileHandler<T> {
public T handle(MultipartFile file);
}
?
封装成接口来使用,代码更简洁,更易读。
?
@Autowired private IGetUploadFile<T> iGetUploadFile;
?只需注入一下,就可以复用代码,获取上传的文件了。
?
以上
?
?
?
原文:http://neverflyaway.iteye.com/blog/2307328