spring-boot-route(三)實現多檔案上傳

Java旅途發表於2020-10-03

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

githubhttps://github.com/binzh303/spring-boot-route

點關注、不迷路

如果覺得文章不錯,歡迎關注點贊收藏,你們的支援是我創作的動力,感謝大家。

如果文章寫的有問題,請不要吝嗇,歡迎留言指出,我會及時核查修改。

如果你還想更加深入的瞭解我,可以微信搜尋「Java旅途」進行關注。回覆「1024」即可獲得學習視訊及精美電子書。每天7:30準時推送技術文章,讓你的上班路不在孤獨,而且每月還有送書活動,助你提升硬實力!

相關文章