SpringBoot2.2上傳文件示例

上傳文件代碼

controller

public class PicController {

    //注入異步線程池
    @Autowired
    private FileThreadPool fileThreadPool;
    @Autowired
    private FileService fileService;

    /**
     * 圖片上傳接口
     *
     * @param uploadFiles
     * @param filePath
     */
    @RequestMapping("/")
    public void uploadPic(@RequestParam(required = false) MultipartFile[] uploadFiles, String filePath) {
        if (ObjectUtil.isEmpty(uploadFiles) || uploadFiles.length < 1 || StrUtil.isBlank(filePath)) {
            return;
        } else {
            fileThreadPool.fileExecutor().execute(() -> fileService.write(uploadFiles, filePath));
        }
    }

}

service

/**
     * 寫入文件到磁盤
     *
     * @param files 文件對象數組
     * @param path  磁盤路徑
     */
public void write(MultipartFile[] files, String path) {
    path = StrUtil.removeSuffix(path, "/");
    path = StrUtil.removeSuffix(path, "\\");
    if (!FileUtil.exist(path)) {
        FileUtil.mkdir(path);
    }
    String finalPath = path;
    Arrays.asList(files).parallelStream().forEach(file -> {
        //拼接磁盤路徑
        String diskPath = finalPath   "/"   file.getOriginalFilename();
        try {
            //刪除原文件
            FileUtil.del(diskPath);
            FileUtil.writeBytes(file.getBytes(), diskPath);
        } catch (IOException e) {
            log.error("寫入文件:{} 異常,發生時間:{} ", diskPath, DateUtil.date().toString(), e);
        }
    });
}

異步線程池

@Component
@EnableAsync
public class FileThreadPool {

    @Bean("fileExecutor")
    public Executor fileExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(25);//核心線程數25:線程池創建時候初始化的線程數
        executor.setMaxPoolSize(50);//最大線程數50:線程池最大的線程數,只有在緩衝隊列滿了之後纔會申請超過核心線程數的線程
        executor.setQueueCapacity(500);//緩衝隊列200:用來緩衝執行任務的隊列
        executor.setKeepAliveSeconds(60);//允許線程的空閒時間60秒:當超過了核心線程出之外的線程在空閒時間到達之後會被銷燬
        executor.setThreadNamePrefix("fileExecutor-");// 線程池名的前綴:設置好了之後可以方便我們定位處理任務所在的線程池
        //* 線程池對拒絕任務的處理策略:這裏採用了CallerRunsPolicy策略,當線程池沒有處理能力的時候,該策略會直接在 execute
        //      方法的調用線程中運行被拒絕的任務;如果執行程序已關閉,則會丟棄該任務*//*
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setAwaitTerminationSeconds(60);
        executor.initialize();
        return executor;
    }

}

注意:代碼裏帶有Util的工具類,均來自 Hutools工具包,一個好的工具,能大大提高你的開發效率,牆裂建議使用。

添加如下maven座標,解鎖更多驚喜。

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.0.7</version>
</dependency>

配置

因爲springboot對上傳文件大小是有默認值的,超過這個值會直接報錯,如下就是錯誤信息:

the request was rejected because its size (15633200) exceeds the configured

可以在 application.ymlapplication.properties 中添加如下參數來指定大小,不同的版本的springboot參數是不一樣的。

需要注意的是單位MB兩個字母都需要大寫,小寫可能會有問題,還有 max-file-size 表示的是單個文件最大是多少,max-request-size 表示的是一次請求文件總大小是多少。

v1.3

multipart.maxFileSize=xxxMB
multipart.maxRequestSize=xxxMB

v1.4-1.5

spring.http.multipart.maxFileSize=xxxMB
spring.http.multipart.maxRequestSize=xxxMB

v2.0

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=50MB

使用postman進行測試

postman測試圖片上傳.png0065ZvZxgy1g58mk7jzpij308c0auglr_看圖王.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章