Spring Boot – File Download
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:
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.
Truy cập http://localhost:8080/download/file/soa.abc
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
Đă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:
Leave a Reply