STACKJAVA

Code ví dụ Spring Boot Download File

Code ví dụ Spring Boot Download File

(Xem lại: Download file với JSP-Servlet)

(Xem lại: Download file với Spring MVC)

Các công nghệ sử dụng:

Tạo Spring Boot Project

Cấu trúc Project

Thư viện sử dụng:

 Ngoài các thự viện có sẵn khi tạo spring boot project, mình dùng thêm thư viện commons-io để đọc file. Các bạn cũng có thể đọc file bằng java.io mà không cần sử dụng thư viện này, nhưng quan điểm của mình là dùng thư viện (vừa nhanh, vừa tránh được nhiều lỗi vặt)
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

(Xem lại: Đọc ghi file với Apache Common IO)

File Controller:

package stackjava.com.sbdownloadfile.controller;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class BaseController {

  @RequestMapping("/")
  public String index() {
    return "index";
  }

  @RequestMapping(value = "/download1", method = RequestMethod.GET)
  public void download1(HttpServletResponse response) throws IOException {
    try {
      File file = ResourceUtils.getFile("classpath:file/demo.txt");

      byte[] data = FileUtils.readFileToByteArray(file);
      // Thiết lập thông tin trả về
      response.setContentType("application/octet-stream");
      response.setHeader("Content-disposition", "attachment; filename=" + file.getName());
      response.setContentLength(data.length);
      InputStream inputStream = new BufferedInputStream(new ByteArrayInputStream(data));
      FileCopyUtils.copy(inputStream, response.getOutputStream());
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  @RequestMapping(value = "/download2", method = RequestMethod.GET)
  public ResponseEntity<InputStreamResource> download2(HttpServletRequest request) throws IOException {
    HttpHeaders responseHeader = new HttpHeaders();
    try {
      File file = ResourceUtils.getFile("classpath:file/demo.txt");
      byte[] data = FileUtils.readFileToByteArray(file);
      // Set mimeType trả về
      responseHeader.setContentType(MediaType.APPLICATION_OCTET_STREAM);
      // Thiết lập thông tin trả về
      responseHeader.set("Content-disposition", "attachment; filename=" + file.getName());
      responseHeader.setContentLength(data.length);
      InputStream inputStream = new BufferedInputStream(new ByteArrayInputStream(data));
      InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
      return new ResponseEntity<InputStreamResource>(inputStreamResource, responseHeader, HttpStatus.OK);
    } catch (Exception ex) {
      return new ResponseEntity<InputStreamResource>(null, responseHeader, HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }
}

Ở đây mình có 2 url thực hiện download file là /download1/download2

Cả 2 url trên đều thực hiện đọc file demo.txt từ folder src/main/resource/file và trả về cho client

Cách 1: /download1: thực hiện giống như download file thông thường với JSP – Servlet: đọc file cần download và ghi file đó ra outputstream của response

Cách 2: /download2: trả về đối tượng ResponseEntity với dữ liệu bên trong. Cách này thường dùng để cung cấp các API vì ngoài dữ liệu trả về nó còn có thêm HTTPStatus.

File demo.txt

File view:

<!DOCTYPE html>
<html>
<head>
<title>Spring Boot Download File</title>
</head>
<body>
  <h2>Demo Spring Boot Download File</h2>
  <a href="download1">/download1</a><br />
  <a href="download2">/download2</a><br />
</body>

</html>

Demo:

 

Download code ví dụ trên tại đây.

Code ví dụ Spring Boot Download File stackjava.com

References:

https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started-first-application.html