Spring Boot默認上傳的單個文件大小1MB
,一次上傳的總文件大小爲10MB
。html
單個文件上傳使用MultipartFile參數來接收文件,多文件使用MultipartFile[]數組來接收,而後遍歷它,當成單文件來處理。前端
問題一:如何配置上傳文件大小限制?java
@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提供了一種方式,將文件上傳到服務器物理路徑下,而後作個映射關係,讓圖片能夠正常被訪問,具體操做以下:git
@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:"爲固定寫法。github
文件上傳後臺實現
@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/
。也就是說若是想訪問靜態資源,則須要將靜態資源 文件放在這四個路徑下面。redis
注:classpath 指的是 SpringBoot項目resourcesspring
若是想自定義靜態資源路徑有兩種方式,數據庫
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。
本文示例代碼已上傳至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(二十二)實現郵件發送功能
這個系列的文章都是工做中頻繁用到的知識,學完這個系列,應付平常開發綽綽有餘。若是還想了解其餘內容,掃面下方二維碼告訴我,我會進一步完善這個系列的文章!