在接手其他同事的项目时,为系统加入文件上传功能,出现的问题。后论坛中论坛中找到解决办法,是引用 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; }
