Java Controller设置返回文件

在Java的Web开发中,我们经常需要处理文件的上传和下载。而在Controller中设置返回文件的功能尤为重要,它可以让我们向用户提供可下载的文件,或者接受用户上传的文件并进行处理。本文将介绍如何在Java Controller中设置返回文件,并通过代码示例详细展示。

1. 设置返回文件的Controller方法

在Java中,我们可以使用Spring MVC框架来实现Controller的功能。在Controller中设置返回文件的方法非常简单,只需要在方法的返回类型前加上ResponseEntity<Resource>即可。ResponseEntity表示一个HTTP响应实体,Resource表示一个可以访问的资源,通常是一个文件。

下面是一个示例的Controller方法,它返回一个名为example.txt的文本文件。

import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
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 java.nio.charset.StandardCharsets;

@Controller
public class FileController {

    @GetMapping("/download")
    public ResponseEntity<Resource> downloadFile() {
        String content = "This is an example file.";
        byte[] contentBytes = content.getBytes(StandardCharsets.UTF_8);
        ByteArrayResource resource = new ByteArrayResource(contentBytes);

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=example.txt")
                .contentType(MediaType.TEXT_PLAIN)
                .contentLength(contentBytes.length)
                .body(resource);
    }

}

在上面的代码中,我们首先创建了一个ByteArrayResource对象,将文本文件的内容以字节数组的形式保存在其中。接着,我们使用ResponseEntity对象来构建HTTP响应实体,设置响应头、响应体的类型、长度和内容,并将ByteArrayResource作为响应体返回。

2. 文件下载示例

为了进一步说明如何设置返回文件的Controller方法,我们可以实现一个文件下载的示例。该示例中,我们将提供一个下载链接,用户点击链接后即可下载一个名为example.txt的文本文件。

import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
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 java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

@Controller
public class FileController {

    private static final String FILE_PATH = "path/to/example.txt";

    @GetMapping("/download")
    public ResponseEntity<Resource> downloadFile() throws IOException {
        Path filePath = Paths.get(FILE_PATH);
        byte[] contentBytes = Files.readAllBytes(filePath);
        ByteArrayResource resource = new ByteArrayResource(contentBytes);

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=example.txt")
                .contentType(MediaType.TEXT_PLAIN)
                .contentLength(contentBytes.length)
                .body(resource);
    }

}

在上面的代码中,我们首先定义了一个常量FILE_PATH,表示要下载的文件路径。然后,我们使用Files.readAllBytes()方法将文件内容读取为字节数组,并创建一个ByteArrayResource对象。接着,我们使用ResponseEntity对象构建HTTP响应实体,设置响应头、响应体的类型、长度和内容,并将ByteArrayResource作为响应体返回。

3. 文件上传示例

除了提供文件下载的功能,Controller还可以接受用户上传的文件,并进行处理。下面是一个简单的文件上传示例,它接受用户上传的文本文件,并将文件内容打印出来。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

@Controller
public class FileController {

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
        if (!file.isEmpty()) {
            String content = new String(file.getBytes(), StandardCharsets.UTF_8);
            System.out.println("File content: " + content);
        }

        return "redirect:/";
    }

}

在上述代码中,我们使用@PostMapping注解来指定处理POST请求的方法。该方法接受一个名为file的MultipartFile参数,表示上传的文件。通过调用file.getBytes()方法,我们可以获取文件的内容,并将其以字符串的形式打印出来。