<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;
只需注入一下,就可以复用代码,获取上传的文件了。
以上