欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring获取上传文件

程序员文章站 2022-04-25 14:29:31
...

 

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

 只需注入一下,就可以复用代码,获取上传的文件了。

 

以上