Spring Boot 教程 – 文件上傳下載
- 2020 年 8 月 15 日
- 筆記
- 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個人部落格
- 版權所有,歡迎保留原文鏈接進行轉載🙃