spring boot 返回文件流
1. 整体流程
步骤 | 描述 |
---|---|
1 | 创建Spring Boot项目 |
2 | 添加依赖 |
3 | 创建Controller |
4 | 实现文件下载逻辑 |
2. 具体步骤
2.1 创建Spring Boot项目
首先,我们需要创建一个Spring Boot项目。可以使用Spring Initializr(
2.2 添加依赖
在创建的Spring Boot项目中,可以通过在pom.xml
文件中添加以下依赖来实现文件下载功能:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.3 创建Controller
接下来,我们需要创建一个Controller类来处理文件下载请求。在该类中,我们将使用@GetMapping
注解来处理GET请求,并使用@ResponseBody
注解将返回值作为响应体返回。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class FileDownloadController {
@GetMapping("/download")
@ResponseBody
public ??? downloadFile() {
// 文件下载逻辑
}
}
在downloadFile
方法中,我们将实现文件下载的逻辑。
2.4 实现文件下载逻辑
为了返回文件流,我们可以使用InputStreamResource
类和ResponseEntity
类。
首先,我们需要创建一个File
对象,表示要下载的文件。然后,我们将该文件转换为InputStream
对象,以便将其作为文件流返回。
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
@Controller
public class FileDownloadController {
@GetMapping("/download")
@ResponseBody
public ResponseEntity<InputStreamResource> downloadFile() throws IOException {
// 创建File对象,表示要下载的文件
File file = new File("path/to/file");
// 将File转换为InputStream
InputStream inputStream = new FileInputStream(file);
// 创建InputStreamResource对象,将其作为文件流返回
InputStreamResource resource = new InputStreamResource(inputStream);
// 设置响应头
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=file.txt");
// 创建ResponseEntity对象,将InputStreamResource作为响应体返回
return ResponseEntity.ok()
.headers(headers)
.contentLength(file.length())
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(resource);
}
}
在上述代码中,path/to/file
应替换为实际的文件路径,file.txt
应替换为实际的文件名。
3. 完整代码
以下是完整的Controller代码:
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
@Controller
public class FileDownloadController {
@GetMapping("/download")
@ResponseBody
public ResponseEntity<InputStreamResource> downloadFile() throws IOException {
File file = new File("path/to/file");
InputStream inputStream = new FileInputStream(file);
InputStreamResource resource = new InputStreamResource(inputStream);
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=file.txt");
return ResponseEntity.ok()
.headers(headers)
.contentLength(file.length())
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(resource);
}
}
4. 总结
通过以上步骤,我们可以实现Spring Boot返回文件流的功能。首先,我们创建Spring Boot项目并添加所需的依赖。然后,我们创建一个Controller类来处理文件下载请求,并实现文件下载逻辑。最后,我们使用InputStreamResource
和ResponseEntity
类来返回文件流。