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. Required fields are marked *