Spring Boot默認上傳的單個文件大小1MB,一次上傳的總文件大小為10MB。
單個文件上傳使用MultipartFile參數來接收文件,多文件使用MultipartFile[]數組來接收,然后遍歷它,當成單文件來處理。
問題一:如何配置上傳文件大小限制?
@Configuration
public class FileConfig implements WebMvcConfigurer {
@Bean
public MultipartConfigElement multipartConfigElement(){
MultipartConfigFactory factory = new MultipartConfigFactory();
// 單個文件大小
factory.setMaxFileSize(DataSize.parse("10240MB"));
// 上傳的總文件大小
factory.setMaxRequestSize(DataSize.parse("20480MB"));
return factory.createMultipartConfig();
}
}
思考:SpringBoot項目推薦使用jar包的方式來運行項目,而實際應用中我們也發現jar包運行項目更加方便。但是當打完jar包后,這個jar的大小就固定好了,上傳的文件肯定傳不到jar包里面了。SpringBoot提供了一種方式,將文件上傳到服務器物理路徑下,然后做個映射關系,讓圖片可以正常被訪問,具體操作如下:
@Configuration
public class FileConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("file:"+"D://uploadfile/");
}
}
addResourceHandler("/static/**")表示訪問路徑為/static/文件名,addResourceLocations("file:"+"D://uploadfile/")表示文件存儲的物理路徑,"file:"為固定寫法。
文件上傳后台實現
@RestController
@Slf4j
public class FileUpload {
@PostMapping("uploadFile")
public List uploadFile(@RequestParam("files") MultipartFile[] files) {
// 存儲上傳成功的文件名,響應給客戶端
List<String> list = new ArrayList<>();
// 判斷文件數組長度
if(files.length <= 0){
list.add("請選擇文件");
return list;
}
for(MultipartFile file : files){
// 源文件名
String originalFilename = file.getOriginalFilename();
// 文件格式
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
// 新文件名,避免文件名重復,造成文件替換問題
String fileName = UUID.randomUUID()+"."+suffix;
// 文件存儲路徑
String filePath = "D:/uploadFile/";
// 文件全路徑
File targetFile = new File(filePath+fileName);
// 判斷文件存儲目錄是否存在,不存在則新建目錄
if(!targetFile.getParentFile().exists()){
targetFile.getParentFile().mkdir();
}
try {
// 將圖片保存
file.transferTo(targetFile);
list.add(originalFilename);
} catch (IOException e) {
log.info("文件上傳異常={}",e);
}
}
return list;
}
}
靜態資源問題
SpringBoot靜態資源默認路徑為:classpath:/META-INF/resources/ ,classpath:/resources/,classpath:/static/,classpath:/public/。也就是說如果想訪問靜態資源,則需要將靜態資源 文件放在這四個路徑下面。
注:classpath 指的是 SpringBoot項目resources
如果想自定義靜態資源路徑有兩種方式,
application.yml中指定
spring:
resources:
static-locations: classpath:/templates/
代碼實現WebMvcConfigurer
@Configuration
public class FileConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/templates/");
}
注:當配置了自定義靜態資源路徑后,其默認配置將失效
文件上傳前端實現
在靜態資源路徑下,新建file.html文件,瀏覽器訪問ip:port/file.html,進入file頁面
<form enctype="multipart/form-data" method="post" action="/uploadFile">
文件:<input type="file" name="files"/>
<input type="submit" value="上傳"/>
</form>
本文示例代碼已上傳至github,點個star支持一下!
Spring Boot系列教程目錄
spring-boot-route(一)Controller接收參數的幾種方式
spring-boot-route(二)讀取配置文件的幾種方式
spring-boot-route(五)整合swagger生成接口文檔
spring-boot-route(六)整合JApiDocs生成接口文檔
spring-boot-route(七)整合jdbcTemplate操作數據庫
spring-boot-route(八)整合mybatis操作數據庫
spring-boot-route(九)整合JPA操作數據庫
spring-boot-route(十一)數據庫配置信息加密
spring-boot-route(十二)整合redis做為緩存
spring-boot-route(十三)整合RabbitMQ
spring-boot-route(十五)整合RocketMQ
spring-boot-route(十六)使用logback生產日志文件
spring-boot-route(十七)使用aop記錄操作日志
spring-boot-route(十八)spring-boot-adtuator監控應用
spring-boot-route(十九)spring-boot-admin監控服務
spring-boot-route(二十)Spring Task實現簡單定時任務
spring-boot-route(二十一)quartz實現動態定時任務
spring-boot-route(二十二)實現郵件發送功能
spring-boot-route(二十四)分布式session的一致性處理
spring-boot-route(二十五)兩行代碼實現國際化
spring-boot-route(二十六)整合webSocket
這個系列的文章都是工作中頻繁用到的知識,學完這個系列,應付日常開發綽綽有余。如果還想了解其他內容,掃面下方二維碼告訴我,我會進一步完善這個系列的文章!

