在浏览器上传文件的前端代码如下,其中action路径用thymeleaf渲染,要注意上传文件的请求方式是post,要加入enctype="multipart/form-data",便于后端用MultipartResolver或者multipart-config解析。
后端代码如下:利用RequestParam来映射文件的name和变量名,利用MultipartFile对象获取文件名,然后去掉名字只取后缀.jpg后利用UUID来随机生成一个图片名字,防止上传重名,文件被覆盖。servletContext.getRealPath方法可以输入一个以webapp为目录的相对路径,获取一个文件的绝对路径(注意:这边只是获得一个路径,即使photo文件夹不存在,也会获得包含photo的绝对路径),获得绝对路径后通过路径创建文件夹路径,然后创建file类型的图片利用transferTo方法实现上传到服务器指定文件夹。
@RequestMapping("/upload")
public String upload(@RequestParam("photo1111") MultipartFile photo,HttpSession session) throws IOException {
//获取上传的文件的文件名
String fileName = photo.getOriginalFilename();
//处理文件重名问题
String hzName = fileName.substring(fileName.lastIndexOf("."));
fileName = UUID.randomUUID().toString() + hzName;
//获取服务器中photo目录的路径
ServletContext servletContext = session.getServletContext();
String photoPath = servletContext.getRealPath("photo");
File file = new File(photoPath);
if(!file.exists()){
file.mkdir();
}
String finalPath = photoPath + File.separator + fileName;
//实现上传功能
photo.transferTo(new File(finalPath));
return "success";
}
重点!!
(1)利用CommonsMultipartResolver解决文件上传
一、基于XML开发
以上的文件传输本身不存在难度,但是在配置文件方面要注意一些细节。在Spring较早的版本,利用CommonsMultipartResolver进行处理时,需要利用Maven引入如下jar包
同时,需要在SpringMVC.xml的配置文件中配置:
需要导入的解析器是MultipartResolver,由于其为接口,因此需要导入接口的实现类CommonsMultipartResolver,需要注意的是Spring管理该bean的时候不会根据类型进行注入,而是根据id,因此id必须为multipartResolver。
二、基于注解开发
和基于xml的方式一致,仅将SpringMVC.xml文件中的bean以注解的方式标注在SpringMvcConfig即可,代码如下:
//配置文件上传解析器
@Bean
public CommonsMultipartResolver multipartResolver(){
return new CommonsMultipartResolver();
}
(2)利用
一、基于XML开发
由于Spring6以后删除了commons包,而MultipartResolver接口的实现类还有一个StandardServletMultipartResolver,因此可以利用以下的类来完成配置。
class="org.springframework.web.multipart.support.StandardServletMultipartResolver"
具体的改动如下所示:
这里,我们采用
multipartResolver解析器的
经过测试,如果使用StandardServletMultipartResolve,其实并不需要引入该类的bean,仅需要配置multipart-config的配置即可。
二、基于注解开发
在SpringMVC中,我们将原来的SpringMVC以及web.xml中的配置文件都写在了SpringMvcConfig以及WebInitConfig当中,SpringMvcConfig中配置组件扫描、注解驱动、拦截器、利用Servlet处理静态资源、自定义异常、Thymeleaf解析器等(StandardServletMultipartResolver依旧可以不配置),而在WebInitConfig中我们不仅要指定DispatcherServlet的映射规则,SpringMVC配置文件等,还需要指定一个类似于XML文件中<multipart-config>功能的一个方法,即重写customizeRegistration方法,代码如下:
package config;
import jakarta.servlet.Filter;
import jakarta.servlet.MultipartConfigElement;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletRegistration;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class WebInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class>[] getRootConfigClasses() {
return new Class[0];
}
@Override
protected Class>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected Filter[] getServletFilters() {
//配置一个设置请求与响应字符编码的过滤器
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
encodingFilter.setForceRequestEncoding(true);
//配置一个RESTful的method提交方式的filter
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
return new Filter[]{encodingFilter,hiddenHttpMethodFilter};
}
@Override
//设置文件上传中的MultipartFile核心配置
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
//设置允许上传的单个文件大小 5M
long maxFileSize = 5 * 1024 * 1024;
//设置允许上传的总文件大小 20M
long maxRequestSize = 20 * 1024 * 1024;
//设置文件上传阈值
int fileSizeThreshold =0;
registration.setMultipartConfig(
new MultipartConfigElement(null,maxFileSize,maxRequestSize,fileSizeThreshold));
}
}
推荐阅读
发表评论