SpringBoot文件下載
1.項目結構
2.FileController.java
package xin.baizhiedu.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.net.URLEncoder;
@Controller
@RequestMapping("/file")
public class FileController {
private static final Logger log = LoggerFactory.getLogger(FileController.class);
@Value("${file.download.dir}")
private String realPath;
/**
* 文件下載
* @param fileName
*/
@RequestMapping("/download")
public void downloadFile(String fileName, HttpServletResponse response) throws Exception {
log.debug("當前下載的文件名是:{}", fileName);
log.debug("當前下載的文件的目錄是:{}", realPath);
// 1.去指定目錄讀取文件
File file = new File(realPath, fileName);
// 2.將文件讀取為文件輸入流
FileInputStream is = new FileInputStream(file);
// 2.1 獲取響應流之前 一定要設置以附件形式下載
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 3.獲取響應輸出流
ServletOutputStream os = response.getOutputStream();
// 4.輸入流復制給輸出流
/*int len = 0;
byte[] buff = new byte[1024];
while (true) {
len = is.read(buff);
if (len==-1) break;
os.write(buff, 0, len);
}*/
// 5.釋放資源
/*os.close();
is.close();*/
FileCopyUtils.copy(is,os);
}
}
3.index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h1>Hello index !</h1>
<h1>測試文件下載</h1> <br/>
<a th:href="@{/file/download(fileName=HELP.md)}">HELP.md</a> <br/>
<!--<a th:href="@{/file/download?fileName=readme.txt}">readme.txt</a> <br/>-->
<a th:href="@{/file/download(fileName=readme.txt)}">readme.txt</a> <br/>
<!--<a th:href="@{/file/download?fileName=項目介紹.md}">項目介紹.md</a> <br/>-->
<a th:href="@{/file/download(fileName=項目介紹.md)}">項目介紹.md</a> <br/>
</body>
</body>
</html>
4.application.yml
server:
port: 8080
# servlet:
# context-path: /springboot_day06
logging:
level:
root: info
xin.baizhiedu.controller: debug
file:
download:
dir: D:\IntelliJ IDEA 202101Projects\SpringBoot-Baizhiedu\springboot_day06-download\download # 指定下載目錄測試環境
# /home/download # 指定上線環境的目錄
5.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>xin.baizhiedu</groupId>
<artifactId>springboot_day06-download</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_day06-download</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
6.測試