在接手其他同事的項目時,為系統加入文件上傳功能,出現的問題。后論壇中論壇中找到解決辦法,是引用 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; }
