Spring Boot返回文件流

在Web开发中,有时候我们需要返回文件给前端或者下载文件到本地。Spring Boot提供了简单而强大的方式来处理这些需求。在本文中,我们将学习如何使用Spring Boot返回文件流。

准备工作

首先,我们需要创建一个Spring Boot项目。你可以使用Spring Initializer( Boot项目。确保选择合适的依赖项,如Spring WebThymeleaf

返回文件

首先,我们需要创建一个Controller来处理文件请求。在Spring Boot中,我们可以通过使用@RestController注解来创建一个处理HTTP请求的Controller。

@RestController
public class FileController {

    @GetMapping("/download")
    public ResponseEntity<Resource> downloadFile() throws IOException {
        // 生成文件流
        InputStreamResource resource = new InputStreamResource(new FileInputStream("path/to/file"));

        // 设置响应头,告诉浏览器文件的类型和大小
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=filename.ext");
        headers.add(HttpHeaders.CONTENT_TYPE, "application/octet-stream");
        headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(resource.contentLength()));

        // 返回文件流
        return ResponseEntity.ok()
                .headers(headers)
                .body(resource);
    }
}

在上面的代码中,我们使用了InputStreamResource来包装文件的输入流。然后,我们设置了响应头,包括文件的类型、大小和下载的文件名。最后,我们通过ResponseEntity.ok()方法返回文件流。

测试接口

现在,我们可以使用浏览器或者发送HTTP请求工具来测试我们的接口。访问/download接口,会自动下载文件到本地。

扩展功能

除了返回文件流,我们还可以添加一些其他功能,例如限制文件的访问权限、返回文件列表等。

文件权限

如果你希望限制文件的访问权限,可以在Controller中添加一些逻辑来实现。例如,你可以检查用户的身份,根据不同的权限返回不同的文件。

@GetMapping("/download")
public ResponseEntity<Resource> downloadFile(Authentication authentication) throws IOException {
    // 检查用户身份
    if (authentication != null && authentication.isAuthenticated()) {
        // 生成文件流
        InputStreamResource resource = new InputStreamResource(new FileInputStream("path/to/file"));

        // ...
    } else {
        // 没有权限,返回403错误
        return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
    }
}

在上面的例子中,我们通过Authentication对象来检查用户的身份。如果用户没有通过身份验证或者未登录,我们返回403错误。

文件列表

如果你希望返回一个文件列表,可以将文件的信息封装成一个对象的列表,并返回JSON格式的数据。

@GetMapping("/files")
public List<FileInfo> getFiles() {
    List<FileInfo> files = new ArrayList<>();

    // 遍历文件列表
    File folder = new File("path/to/folder");
    File[] listOfFiles = folder.listFiles();
    for (File file : listOfFiles) {
        if (file.isFile()) {
            // 封装文件信息
            FileInfo fileInfo = new FileInfo();
            fileInfo.setName(file.getName());
            fileInfo.setSize(file.length());

            files.add(fileInfo);
        }
    }

    // 返回文件列表
    return files;
}

在上面的例子中,我们遍历了文件夹中的所有文件,并将每个文件的名称和大小封装成一个FileInfo对象。然后,我们将所有的FileInfo对象添加到一个列表中,并返回该列表。

总结

在本文中,我们学习了如何使用Spring Boot返回文件流。我们创建了一个Controller来处理文件请求,并使用InputStreamResource来包装文件的输入流。我们还介绍了一些扩展功能,例如限制文件的访问权限和返回文件列表。希望本文能够帮助你理解并使用Spring Boot返回文件流的功能。