post-image

Spring Boot – File Download

Spring Boot Starters & Common Configurations

Trong ví dụ này, chúng ta sẽ tìm hiểu cách download 1 file sử dụng Spring Boot Application. Để làm được như vậy chúng ta sẽ tạo 1 Controller có những thứ sau:

  • Kiểu trả về của Controller là void và thêm HttpServletResponse làm đối tượng cho phương thức.
  • Trong HTTP response thông thường, Content-Disposition response header là header cho biết nếu nội dung được mong đợi có được hiển thị nội tuyến trong trình duyệt, nghĩa là, dưới dạng 1 trang Web hoặc 1 phần của trang Web, hoặc dưới dạng tệp đính kèm, được tải xuống và lưu cụ bộ. Đặt Content-Disposition cho phù hợp.
  • Tìm MIME Type của file tải xuống. Đây có thể là application/pdf, text/html, application/xml, v.v. Nếu mimetype không xác định, thì nó được đặt thành application/octet-stream. Trong trường hợp này, trình duyệt sẽ hiển thị SAVE AS.
  • Copy các byte vào OutputStream response từ InputStream.

Maven Project:

boot-45_1

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.javainuse</groupId> <artifactId>boot-filedownload</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.1.RELEASE</version> <relativePath /> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
Code language: HTML, XML (xml)
SpringBootFileDownoad.java
package com.javainuse; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringBootFileDownoad { public static void main(String[] args) { SpringApplication.run(SpringBootFileDownoad.class, args); } }
Code language: JavaScript (javascript)
FileDownloadController.java
package com.javainuse.controller; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLConnection; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/download") public class FileDownloadController { private static final String EXTERNAL_FILE_PATH = "C:/fileDownloadExample/"; @RequestMapping("/file/{fileName:.+}") public void downloadPDFResource(HttpServletRequest request, HttpServletResponse response, @PathVariable("fileName") String fileName) throws IOException { File file = new File(EXTERNAL_FILE_PATH + fileName); if (file.exists()) { //get the mimetype String mimeType = URLConnection.guessContentTypeFromName(file.getName()); if (mimeType == null) { //unknown mimetype so set the mimetype to application/octet-stream mimeType = "application/octet-stream"; } response.setContentType(mimeType); /** * In a regular HTTP response, the Content-Disposition response header is a * header indicating if the content is expected to be displayed inline in the * browser, that is, as a Web page or as part of a Web page, or as an * attachment, that is downloaded and saved locally. * */ /** * Here we have mentioned it to show inline */ response.setHeader("Content-Disposition", String.format("inline; filename=\"" + file.getName() + "\"")); //Here we have mentioned it to show as attachment //response.setHeader("Content-Disposition", String.format("attachment; filename=\"" + file.getName() + "\"")); response.setContentLength((int) file.length()); InputStream inputStream = new BufferedInputStream(new FileInputStream(file)); FileCopyUtils.copy(inputStream, response.getOutputStream()); } } }
Code language: JavaScript (javascript)

Chạy ứng dụng và truy cập http://localhost:8080/download/file/soa.pdf.

boot-45_2

Truy cập http://localhost:8080/download/file/soa.abc

boot-45_3

Ví dụ têp từ chúng tôi nhận được là 1 mimetype không xác định, vì vậy đã nhận được 1 cửa sổ Save As và nội dung không được hiển thị nội tuyến.

Trong FileDownloadController ở trên, đặt Content-Disposition làm tệp đính kèm và truy cập lại vào url http://localhost:8080/download/file/soa.pdf

boot-45_3

Đăng ký nhận bộ tài liệu kỹ năng dành cho lập trình viên (video hướng dẫn + slide) tại đây

Nguồn:

https://www.javainuse.com/spring/boot-file-download

Leave a Reply

Your email address will not be published.