在接手其他同事的项目时,为系统加入文件上传功能,出现的问题。后论坛中论坛中找到解决办法,是引用 commons-fileupload查看,重写multipartResolver实现文件上传,因为其他系统无需特殊配置就可以实现文件上传,所有继续寻找问题根源,发现项目中 dispatcherRegistration配置引起的问题
项目版本信息如下
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
文件上传大小限制配置
spring.servlet.multipart.max-request-size=100MB
spring.servlet.multipart.max-file-size=100MB
文件上传前端使用的layui的上传插件,具体代码如下
function initUpdataPdf() { layui.use(['form', 'element', 'table', 'layer', 'laydate', 'upload'], function () { var form, element, layer; form = layui.form , element = layui.element , table = layui.table , layer = layui.layer , upload = layui.upload; var $ = layui.jquery var uploadInst = upload.render({ elem: '#addPdfButton' , url: contextPath + 'documents/uploadPdf' , accept: 'file' //只允许pdf文件 , acceptMime: 'file/pdf' //只允许pdf文件 , size: 100 * 1024 //限制文件大小,单位 KB , field: 'file' , before: function (obj) { //预读本地文件示例,不支持ie8 obj.preview(function (index, file, result) { layer.msg('上传中...', {icon: 16, shade: [0.5, '#f5f5f5'], scrollbar: false, time: 100000}); }); } , done: function (res) { layer.closeAll() //如果上传失败 if (isNotEmpty(res) && isNotEmpty(res.code) && res.code == 0) { layer.msg('上传成功!'); initPagination(); } else { return layer.msg('上传失败'); } } }); form.render(); }); }
后台Controller 文件接收代码
@PostMapping("/attInfo/uploadPdf") @ResponseBody public Map uploadPdf(@RequestParam("file") MultipartFile file) { Map<String, Object> map = new HashMap<>(); map.put("code", 0); map.put("msg", ""); Integer code = 0; String msg = ""; String name = file.getOriginalFilename(); File fileBean = new File(fileBasePathProperties.getTmpFileBasePath() + name); String id = ""; try { file.transferTo(fileBean); id = saveProductsAttInfo.getAttId(); map.put("code", 0); } catch (IOException e) { map.put("code", 1); map.put("msg", "保存错误"); e.printStackTrace(); } map.put("id", id); map.put("name", name); return map; }
解决办法 1:取自网络
第一步:在pom.xml中加入以下代码
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.8.0</version> </dependency>
第二步:加入配置类
@Configuration public class UploadConfig { //显示声明CommonsMultipartResolver为mutipartResolver @Bean(name = "multipartResolver") public MultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setDefaultEncoding("UTF-8"); //resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常 resolver.setResolveLazily(true); resolver.setMaxInMemorySize(40960); //上传文件大小 50M 50*1024*1024 resolver.setMaxUploadSize(50 * 1024 * 1024); return resolver; } }
第三步:在启动类上修改注解
@SpringBootApplication(exclude={MultipartAutoConfiguration.class})
解决办法 2
我的项目中去掉以下配置即可,若没有以下配置,需要自行查找servlet相关的配置
@Bean public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) { ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet); registration.addUrlMappings("/*"); return registration; }