SpringBoot ファイルをダウンロードするサンプル

SpringBootのファイルをダウンロードするサンプルです。
(確認環境:Spring Boot 2.5,JDK 11)

目次

サンプル ファイルをダウンロードする
  コントローラ(FileController.java)
  画面(index.html)
  設定ファイル(application.properties)
  実行結果

ファイルをダウンロードする

ファイルをダウンロードする流れは、以下のとおりです。

1.画面でボタンをクリックして起動する。

2.コントローラが所定の位置にあるファイルをダウンロードします。

http://localhost:8765/でアクセスします。

githubにコードがあります。
https://github.com/ut23405/springboot/tree/master/springboot-filedownload

 

コントローラ(FileController.java)

package com.example.demo;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class FileController {

    @GetMapping
    String index(Model model) {
        return "/index";
    }

    @PostMapping("/testDownload")
    String download(HttpServletResponse response) {
    	
        try (OutputStream os = response.getOutputStream();) {
        	
        	Path filePath = Paths.get("D:/test1/" + "test1.txt");
        	
            byte[] fb1 = Files.readAllBytes(filePath);

            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment; filename=test1.txt");
            response.setContentLength(fb1.length);
            os.write(fb1);
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

17行目は、画面の初期表示です。
22行目は、ファイルダウンロードで使用するHttpServletResponseです。
26行目は、ダウンロードするファイルです。
test1.txtの箇所を変更すれば各種ファイルをダウンロードできます。
例:エクセルファイル(test1.xlsx)、PDFファイル(test1.pdf)等

28行目は、バイトに変換しています。
30~32行目は、レスポンスヘッダに値をセットしています。
application/octet-streamは、汎用的なバイナリデータを想定しています。


以下は、HttpServletResponseのJavaDocです。
https://spring.pleiades.io/specifications/platform/8/apidocs/javax/servlet/http/httpservletresponse

画面(index.html)

<!DOCTYPE html>
<html xmlns:th="https://thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>download</title>
</head>
<body>
    <form method="post" th:action="@{/testDownload}">
      <input type="submit" value="ダウンロード" />
    </form>
</body>
</html>

ボタンを押すとダウンロードします。

設定ファイル(application.properties)

server.port = 8765

ポート番号を変更しています。

実行結果

画面のボタンを押すとファイルがダウンロードされます。

レスポンスヘッダーにセットした値が表示されます。

関連の記事

SpringBoot フォームで入力チェック(バリデーション)

△上に戻る