當前位置:
首頁 > 知識 > SpringBoot | 第十七章:web 應用開發之文件上傳

SpringBoot | 第十七章:web 應用開發之文件上傳

(點擊

上方公眾號

,可快速關注)




來源:oKong ,


blog.lqdev.cn/2018/08/07/springboot/chapter-seventeen/




前言



上一章節,我們講解了利用模版引擎實現前端頁面渲染,從而實現動態網頁的功能,同時也提出了兼容jsp項目的解決方案。既然開始講解web開發了,我們就接著繼續往web這個方向繼續吧。通常,我們在做web開發時,碰見諸如附件上傳、圖片頭像上傳等文件的上傳需求也是再正常不過的。那麼,我們今天我們就來講講SpringBoot下文件上傳的功能的實現。




一點知識




我們知道,前端上傳文件時,最常見的就是利用Form表單的方式進行文件的上傳功能了,上傳時設置enctype為multipart/form-data,或者直接利用jquery的一些上傳插件實現。而後端,在jsp+Servlet時代,最常見的就是利用smartupload上傳組件。而在SpringMvc時代,其提供了MultipartFile封裝類,它包含了文件的二進位流和文件相關屬性(文件名、大小等)。所以在SpringBoot中也是使用此封裝類進行文件上傳的。




文件上傳




上面說到,springmvc中是利用MultipartFile進行文件上傳的。而MultipartFile是個介面類,它的實現類有CommonsMultipartFile和StandardMultipartFile。這裡簡單說明下:




StandardMultipartFile

:是基於j2ee自帶的文件上傳進行解析,即使用Servlet3.0提供的javax.servlet.http.Part上傳方式。




CommonsMultipartFile

:是基於apache fileupload的解析。



所以正常我們使用時,也是無需關係底層是以哪種方式進行文件上傳處理的,SpringMvc會給我們做相應的轉換的。




這裡演示下兩種方式。




基於J2EE自帶方式




這種方式下,其實無需任何配置。只需按正常的web開發項目集成即可。



0.pom依賴





<dependency>


    <groupId>org.springframework.boot</groupId>


    <artifactId>spring-boot-starter-web</artifactId>


</dependency>




1.配置文件(可選),正常只需要設置上傳的文件大小





# 最大支持文件大小 即單個文件大小


spring.http.multipart.max-file-size=1Mb


# 最大支持請求大小 即一次性上傳的總文件大小


spring.http.multipart.max-request-size=10Mb




其他的配置,可直接參考官網的配置信息:https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#common-application-properties






2.編寫控制類



FileUploadController.java:





@RestController


@Slf4j


public class FileUploadController {


 

    @PostMapping("/upload")


    public String upload(@RequestParam MultipartFile file) throws IllegalStateException, IOException {


        // 判斷是否為空文件


        if (file.isEmpty()) {


            return "上傳文件不能為空";


        }


        // 文件類型


        String contentType = file.getContentType();


        // springmvc處理後的文件名


        String fileName = file.getName();


        log.info("伺服器文件名:" + fileName);


        // 原文件名即上傳的文件名


        String origFileName = file.getOriginalFilename();


        // 文件大小


        Long fileSize = file.getSize();


 


        // 保存文件


        // 可以使用二進位流直接保存


        // 這裡直接使用transferTo


        file.transferTo(new File("d://okong-" + origFileName));


 


        return String.format(file.getClass().getName() + "方式文件上傳成功!
文件名:%s,文件類型:%s,文件大小:%s", origFileName, contentType,fileSize);


 


    }


}




3.啟動應用,然後使用postman進行api調用即可,當然大家也可以利用上節課學習的模版引擎技術,編寫一個文件上傳的表單。







基於FileUpload包方式




原來在Springmvc時,我們通常都是使用CommonsMultipartResolver進行文件上傳處理類配置的,比如最大上傳文件大小的。而基於在SpringBoot下,略微有些不同。




0.pom加入fileUpload依賴





<dependency>


    <groupId>commons-fileupload</groupId>


    <artifactId>commons-fileupload</artifactId>


    <version>1.3.3</version>


</dependency>




1.編寫一個配置類




FileUploadConfig.java





@Configuration


public class FileUploadConfig {


     


    @Bean


    public MultipartResolver custom() {


        return new CommonsMultipartResolver();


    }


}




2.由於spring.http.multipart.enabled默認是true,所以載入類MultipartAutoConfiguration會自動載入,這樣fileUpload就會異常了。所以正常有兩種方式:在啟動類下將此配置類不進行自動載入





@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})




另一種就是,直接設置spring.http.multipart.enabled為false。


本示例為了兩種可切換,使用的是第二種。




3.編寫控制層:這個和J2EE的方式是一樣的,這裡就不貼了。


4.啟動應用,使用postman訪問下:







相關資料






  • https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/




總結




本章節主要是講解了兩種方式來進行文件的上傳功能。這裡就簡單的介紹了兩種方式的相關配置和一些注意點,像文件大小過大時進行異常捕獲,大家可以使用全局異常類來進行捕獲,只需捕獲MultipartException異常即可,這裡就示例了,相對來說比較簡單了。




最後




目前互聯網上很多大佬都有SpringBoot系列教程,如有雷同,請多多包涵了。本文是作者在電腦前一字一句敲的,每一步都是實踐的。若文中有所錯誤之處,還望提出,謝謝。




系列






  • SpringBoot | 第一章:第一個 SpringBoot 應用



  • SpringBoot | 第二章:lombok 介紹及簡單使用



  • SpringBoot | 第三章:springboot 配置詳解



  • SpringBoot | 第四章:日誌管理



  • SpringBoot | 第五章:多環境配置



  • SpringBoot | 第六章:常用註解介紹及簡單使用



  • SpringBoot | 第七章:過濾器、監聽器、攔截器



  • SpringBoot | 第八章:統一異常、數據校驗處理



  • SpringBoot | 第九章:Mybatis-plus 的集成和使用



  • SpringBoot | 第十章:Swagger 2 的集成和使用



  • SpringBoot | 第十一章:Redis 的集成和簡單使用



  • SpringBoot | 第十二章:RabbitMQ 的集成和使用



  • SpringBoot | 第十三章:測試相關 ( 單元測試、性能測試 )



  • SpringBoot | 第十四章:基於 Docker 的簡單部署



  • SpringBoot | 第十五章:基於 Postman 的 RESTful 介面測試



  • SpringBoot | 第十六章:web 應用開發




【關於投稿】




如果大家有原創好文投稿,請直接給公號發送留言。




① 留言格式:


【投稿】+《 文章標題》+ 文章鏈接

② 示例:


【投稿】《不要自稱是程序員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/

③ 最後請附上您的個人簡介哈~






看完本文有收穫?請轉發分享給更多人


關注「ImportNew」,提升Java技能


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 ImportNew 的精彩文章:

SpringBoot | 第十四章:基於 Docker 的簡單部署
使用 JITWatch 查看 JVM 的 JIT 編譯代碼

TAG:ImportNew |