spring-boot-route(三)實現多文件上傳
- 2020 年 10 月 3 日
- 筆記
- spring-boot-route
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>
這裡需要注意的是文件上傳表單的enctype為multipart/form-data。
此是spring-boot-route系列的第三篇文章,這個系列的文章都比較簡單,主要目的就是為了幫助初次接觸Spring Boot 的同學有一個系統的認識。本文已收錄至我的github,歡迎各位小夥伴star
!
github://github.com/binzh303/spring-boot-route
點關注、不迷路
如果覺得文章不錯,歡迎關注、點贊、收藏,你們的支援是我創作的動力,感謝大家。
如果文章寫的有問題,請不要吝嗇,歡迎留言指出,我會及時核查修改。
如果你還想更加深入的了解我,可以微信搜索「Java旅途」進行關注。回復「1024」即可獲得學習影片及精美電子書。每天7:30準時推送技術文章,讓你的上班路不在孤獨,而且每月還有送書活動,助你提升硬實力!