在浏览器上传文件的前端代码如下,其中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包

commons-fileupload

commons-fileupload

1.5

同时,需要在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"

具体的改动如下所示:

 

这里,我们采用 标签的方式,不需要在pom文件中引入依赖,也不需要导

 multipartResolver解析器的,而是在web.xml文件中 DispatcherServlet的网页映射配置中,引入标签即可。

SpringMVC

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:SpringMVC.xml

1

10485760

10485760

0

SpringMVC

/

经过测试,如果使用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));

}

}

推荐阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。