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:
- Spring Boot 2.0.2
- Maven
- JDK 1.8
- Eclipse + Spring Tool Suite
- Thymeleaf
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
và /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>