Spring Boot 教程 - 檔案上傳下載
在日常的開發工作中,基本上每個專案都會有各種檔案的上傳和下載,大多數檔案都是excel檔案,操作excel的JavaAPI我用的是apache的POI進行操作的,POI我之後會專門講到。此次我們不講如何操作檔案,只講如何上傳檔案和下載檔案。
1. 檔案的上傳
在現在的JavaWeb專案中,與前端進行互動的基本都是SpringMVC框架。Spring專門提供了一個介面MultipartFile
,這個介面幫我們簡化了從頁面到服務端的檔案操作,以前我們只能從request裡面拿,現在有了這個介面,我們操作起來就會很簡單。話不多說,直接上程式碼。
我們只是模擬檔案上傳的操作,所以我們從頁面上傳檔案,然後存到電腦桌面。
@RequestMapping("/upload") public void upload(MultipartFile file) throws IOException { init(file, 1); } @RequestMapping("/uploads") public void uploads(MultipartFile[] files, DTO dto) throws IOException { for (int i = 0; i < files.length; i++) { init(files[i], i); } System.out.println(dto.getParam()); } /** * 下載檔案初始化 * @param file 檔案 * @param i 為了區別檔案,防止被覆蓋 * @throws IOException */ private void init(MultipartFile file, int i) throws IOException { String filename = file.getOriginalFilename(); OutputStream os = new FileOutputStream(new File("C:\\Users\\WJF\\Desktop" + File.separator + i + filename)); InputStream is = file.getInputStream(); StreamUtils.copy(is, os); is.close(); os.close(); }
上面的程式碼中,不管是單個檔案還是多檔案都是很簡單的,還可以帶其他引數DTO
。
2. 檔案的下載
檔案的下載也是很簡單的,但是Response頭如果沒有設定好,就可能下載失敗,下載下來也可能是亂碼的。但是這些頭設定其實很簡單,但是每次下載檔案的時候都要這麼設定一下,其實是很繁瑣的,所以在這裡我使用了已經封裝好的下載API,直接上程式碼。
首先我們引入jar包:
<!--springboot父工程--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <!--springboot框架web元件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--wjf-download下載小框架,用來簡化下載的無味繁瑣的操作--> <dependency> <groupId>red.wjf</groupId> <artifactId>wjf-download</artifactId> <version>0.1.0.RELEASE</version> </dependency> </dependencies>
在這裡我引入了一個下載的jar包,這個包可以在maven中央倉庫直接找到的。這個下載檔案jar包的官網地址:傳送門
在下載檔案之前我們需要配置一下,建立一個下載器,將下載器交給Spring管理:
DownloadConfig.java
:
package com.butterflytri.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import red.wjf.download.downloader.ImageDownloader;
import red.wjf.download.downloader.WebDownloader;
/**
* @author: WJF
* @date: 2020/7/29
* @description: DownloadConfig
*/
@Configuration
public class DownloadConfig {
@Bean
public WebDownloader webDownloader() {
return new WebDownloader();
}
@Bean
public ImageDownloader imageDownloader() {
return new ImageDownloader();
}
}
在這裡我們建立了兩個下載器,都交給了Spring框架管理。
@RequestMapping("/downloadTest")
public void download01(HttpServletRequest request, HttpServletResponse response, String fileName) {
InputStream is = this.getClass().getClassLoader().getResourceAsStream("test.docx");
try {
DataWriter writer = new DataWriter(is);
webDownloader.defaultDownload(request, response, fileName, writer);
} catch (IOException e) {
e.printStackTrace();
}
}
@RequestMapping("/downloadImg")
public void downloadImg(HttpServletRequest request, HttpServletResponse response) {
InputStream is = this.getClass().getClassLoader().getResourceAsStream("img.jpg");
ImageWriter writer = new ImageWriter(is, ImgSuffix.JPG);
imageDownloader.defaultDownload(request, response, writer);
}
這兩個檔案(test.docx和img.jpg)都在類路徑下,從瀏覽器頁面呼叫方法,就會下載,不會亂碼也不會下載失敗,除非檔案不存在。jar包還提供了圖片的Base64格式下載。在國內我們只需要呼叫這個預設的下載方法就可以了。下載的演示我就不演示了,大家可以拉下我的程式碼看看,覺得我寫的東西對你有用,也可以給我點個贊哦。
3. 專案地址
本專案傳送門:
- GitHub ---> spring-upload-download
- Gitee ---> spring-upload-download
此教程會一直更新下去,覺得博主寫的可以的話,關注一下,也可以更方便下次來學習。
- 作者:Butterfly-Tri
- 出處:Butterfly-Tri個人部落格
- 版權所有,歡迎保留原文連結進行轉載