???<前文回顧>
<今日更新>
一、開篇整活兒
今兒個咱嘮嘮 Spring Boot 里頭的文件上傳與下載。這玩意兒吧,說大不大,說小不小,整好了是錦上添花,整不好就是火上澆油。你要是剛入門,那可得悠著點兒,別一上來就整得自己“翻車”了。
二、文件上傳與下載是啥玩意兒?
文件上傳與下載是 Web 開發里頭的一個常見需求,說白了就是讓用戶能把文件傳到服務器上,或者從服務器上下載文件。Spring Boot 里頭默認就集成了文件上傳與下載的支持,用起來賊方便。
1. 文件上傳的核心概念
文件上傳里頭有幾個核心概念:MultipartFile、MultipartResolver、File。
- MultipartFile:就是上傳的文件對象,里頭包含了文件的內容、文件名、文件類型啥的。
- MultipartResolver:就是解析上傳文件的組件,Spring Boot 里頭默認用的是?StandardServletMultipartResolver。
- File:就是 Java 里頭的文件對象,用來表示文件。
2. 文件下載的核心概念
文件下載里頭有幾個核心概念:Resource、HttpServletResponse、FileSystemResource。
- Resource:就是 Spring 里頭的資源對象,用來表示文件。
- HttpServletResponse:就是 HTTP 響應對象,用來設置響應頭、響應體啥的。
- FileSystemResource:就是 Spring 里頭的文件系統資源對象,用來表示文件。
三、Spring Boot 實現文件上傳
Spring Boot 里頭實現文件上傳很簡單,只要加個配置,配個控制器就行了。
1. 添加配置
首先,你得在?application.properties?里頭加個文件上傳的配置。
Properties Code |
spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=50MB |
這段代碼里頭,spring.servlet.multipart.enabled?是啟用文件上傳,spring.servlet.multipart.max-file-size?是單個文件的最大大小,spring.servlet.multipart.max-request-size?是請求的最大大小。
2. 實現文件上傳
然后,你可以在控制器里頭實現文件上傳。
Java Code |
@RestController @RequestMapping("/files") public class FileController { ????@PostMapping("/upload") ????public String uploadFile(@RequestParam("file") MultipartFile file) { ????????if (file.isEmpty()) { ????????????return "文件不能為空"; ????????} ????????try { ????????????File dest = new File("uploads/" + file.getOriginalFilename()); ????????????file.transferTo(dest); ????????????return "文件上傳成功"; ????????} catch (IOException e) { ????????????e.printStackTrace(); ????????????return "文件上傳失敗"; ????????} ????} } |
這段代碼里頭,uploadFile?方法用?@RequestParam("file")?注解接收上傳的文件,然后用?transferTo?方法把文件保存到服務器上。
四、Spring Boot 實現文件下載
Spring Boot 里頭實現文件下載很簡單,只要加個控制器就行了。
1. 實現文件下載
首先,你可以在控制器里頭實現文件下載。
Java Code |
@RestController @RequestMapping("/files") public class FileController { ????@GetMapping("/download/{filename}") ????public ResponseEntity<Resource> downloadFile(@PathVariable String filename) { ????????try { ????????????File file = new File("uploads/" + filename); ????????????Resource resource = new FileSystemResource(file); ????????????return ResponseEntity.ok() ????????????????????.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") ????????????????????.body(resource); ????????} catch (Exception e) { ????????????e.printStackTrace(); ????????????return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); ????????} ????} } |
這段代碼里頭,downloadFile?方法用?@PathVariable?注解接收文件名,然后用?FileSystemResource?把文件作為資源返回。
五、Spring Boot 實現文件管理的坑點
1. 文件大小限制
Spring Boot 里頭,文件大小限制沒配好,那文件上傳就不起作用了。你要是沒配好,那可得好好檢查檢查。
2. 文件保存路徑
Spring Boot 里頭,文件保存路徑沒配好,那文件上傳就不起作用了。你要是沒配好,那可得好好檢查檢查。
3. 文件下載響應頭
Spring Boot 里頭,文件下載響應頭沒配好,那文件下載就不起作用了。你要是沒配好,那可得好好檢查檢查。
專有名詞解釋
- MultipartFile:上傳的文件對象,里頭包含了文件的內容、文件名、文件類型啥的。
- MultipartResolver:解析上傳文件的組件,Spring Boot 里頭默認用的是?StandardServletMultipartResolver。
- File:Java 里頭的文件對象,用來表示文件。
- Resource:Spring 里頭的資源對象,用來表示文件。
- HttpServletResponse:HTTP 響應對象,用來設置響應頭、響應體啥的。
- FileSystemResource:Spring 里頭的文件系統資源對象,用來表示文件。
- HttpHeaders.CONTENT_DISPOSITION:HTTP 響應頭,用來設置文件下載的響應頭。
寫在最后
身為一個中古程序猿,我有很多自己想做的事情,比如埋頭苦干手搓一個低代碼數據庫設計平臺(目前只針對寫java的朋友),已經在找朋友內測了,比如很喜歡幫身邊的朋友看看簡歷,講講面試技巧,畢竟工作這么多年,也做到過高管,有很多面人經歷,意見還算有用,大家基本都能拿到想要的offer...
我深刻意識到,能自由做自己喜歡的事情是有多么不容易,又是多么有成就感。所以我拉了兩三個志同道合的好友,開了一間公司,繼續朝著“自由”的目標前進。
當下呢,我們希望有更多的朋友能夠參與到產品的測試中來,體驗并且給出更好的建議。未來可能會在博客po更多關于我們產品的內容,包括使用場景、說明、課程等,希望能對大家有所幫助。
另外,想整個花活兒,每天花個1-2小時,來幫助我素未謀面的老朋友們看看簡歷,提提意見啥的,純屬為愛發電。我在線時間不固定,但是不要米,咱就別要自行車兒了唄~如果您有興趣,可以點擊文章底部卡片一起交流(人工回復,比較慢,請擔待)。
最后,請大家持續關注我們的博客,未來還有很多欄目,一起發掘~!
(來呀~↓↓↓~老鐵)