Springmvc文件下载例子

时间:2024-04-02 20:54:39

这段Java代码是一个Spring MVC框架中的控制器方法,用于处理文件下载请求。下面是对代码的注释和解释:

```java
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpSession;
import javax.servlet.ServletContext;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.IOException;
import org.springframework.web.util.ContentNegotiationStrategy;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;

// 定义控制器类,并使用@RequestMapping注解指定基础路由
@RestController
public class FileController {

    // 定义处理 "/testDown" 路径请求的方法,使用GET请求方式
    @RequestMapping(value = "/testDown", method = RequestMethod.GET)
    public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
        // 获取ServletContext对象,它代表了整个Web应用的环境信息
        ServletContext servletContext = session.getServletContext();

        // 获取服务器中文件的真实路径,这里以"/static/img/1.jpg"为例
        String realPath = servletContext.getRealPath("/static/img/1.jpg");

        // 创建文件的输入流,用于读取文件内容
        InputStream is = new FileInputStream(realPath);

        // 创建一个字节数组,大小为流的可用字节数,用于存储文件数据
        byte[] bytes = new byte[is.available()];

        // 将文件内容读取到字节数组中
        is.read(bytes);

        // 创建HttpHeaders对象,用于设置响应头信息
        HttpHeaders headers = new HttpHeaders();

        // 设置响应头,告诉浏览器这是一个文件下载请求,并指定文件名
        headers.add("Content-Disposition", "attachment;filename=1.jpg");

        // 设置响应状态码为OK(200),表示请求成功
        HttpStatus statusCode = HttpStatus.OK;

        // 创建ResponseEntity对象,它包含了响应的数据和HTTP状态码及头部信息
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);

        // 关闭输入流,释放资源
        is.close();

        // 返回ResponseEntity对象,交由Spring框架处理响应
        return responseEntity;
    }
}
```

代码解释:

  1. @RequestMapping("/testDown"):这个注解将方法映射到指定的URL路径"/testDown"。

  2. public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException:这是方法的签名。它返回一个ResponseEntity<byte[]>,表示带有字节数组作为响应体的HTTP响应。该方法接受一个HttpSession对象作为参数。

  3. ServletContext servletContext = session.getServletContext();:这一行从HttpSession中获取ServletContext对象。ServletContext提供对Web应用程序资源和配置的访问。

  4. String realPath = servletContext.getRealPath("/static/img/1.jpg");:这一行获取服务器上文件"1.jpg"在"/static/img"目录中的真实路径。

  5. InputStream is = new FileInputStream(realPath);:这一行创建一个输入流,用于从指定路径读取文件。

  6. byte[] bytes = new byte[is.available()];:这一行创建一个字节数组,大小等于输入流中可用的字节数。

  7. is.read(bytes);:这一行将输入流的内容读取到字节数组中。

  8. is.close();:这一行关闭输入流,释放系统资源。

  9. MultiValueMap<String, String> headers = new HttpHeaders();:这一行创建一个HttpHeaders对象,用于设置响应头信息。

  10. headers.add("Content-Disposition", "attachment;filename=1.jpg");:这一行设置"Content-Disposition"头,指定响应应被视为附件,并且附件的文件名为"1.jpg"。

  11. HttpStatus statusCode = HttpStatus.OK;:这一行将响应的HTTP状态码设置为"200 OK"。

  12. ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);:这一行创建一个ResponseEntity对象,其中字节数组作为响应体,头部和状态码也被设置。

  13. 最后,返回ResponseEntity对象,它表示带有文件内容作为响应体的HTTP响应。