Thymeleafでmultipartfileを使用した実装

Thymeleafでmultipartfileを使用した実装

ThymeleafでMultipartFileを使用したファイルアップロードの実装例を以下に示します。
コードにはファイルアップロードの処理、バリデーション、Thymeleafのフォームを含めています。

1. コントローラクラス

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.Valid;

@Controller
public class FileUploadController {

  @GetMapping("/upload")
  public String showUploadForm(Model model) {
    model.addAttribute("fileUploadForm", new FileUploadForm());
    return "uploadForm";
  }

  @PostMapping("/upload")
  public String handleFileUpload(
    @Valid @ModelAttribute("fileUploadForm") FileUploadForm fileUploadForm,
    BindingResult result,
    RedirectAttributes redirectAttributes
  ) {
    if (result.hasErrors()) {
      return "uploadForm";
    }

    MultipartFile file = fileUploadForm.getFile();
    if (file.isEmpty()) {
      result.rejectValue("file", "error.fileUploadForm", "ファイルが選択されていません");
      return "uploadForm";
    }

    // ファイル処理ロジック(例: ファイルの保存など)
    String fileName = file.getOriginalFilename();
    // ファイルの保存処理などをここに記述

    redirectAttributes.addFlashAttribute("message", "ファイル " + fileName + " がアップロードされました");
    return "redirect:/upload";
  }
}

2. フォームクラス

package com.example.demo.controller;

import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.NotNull;

public class FileUploadForm {

  @NotNull(message = "ファイルを選択してください")
  private MultipartFile file;

  public MultipartFile getFile() {
    return file;
  }

  public void setFile(MultipartFile file) {
    this.file = file;
  }
}

3. Thymeleafテンプレート (uploadForm.html)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <title>ファイルアップロード</title>
</head>
<body>
  <h1>ファイルアップロード</h1>

  <form th:action="@{/upload}" th:object="${fileUploadForm}" method="post" enctype="multipart/form-data">
    <div>
      <label for="file">ファイル:</label>
      <input type="file" th:field="*{file}" />
      <span th:if="${#fields.hasErrors('file')}" th:errors="*{file}">エラーメッセージ</span>
    </div>
    <div>
      <button type="submit">アップロード</button>
    </div>
  </form>

  <div th:if="${message}">
    <p th:text="${message}"></p>
  </div>
</body>
</html>

4. バリデーション設定

FileUploadFormクラスでファイルが選択されているかどうかをチェックするために、@NotNullアノテーションを使用しています。
コントローラでバリデーションエラーが発生した場合には、エラーメッセージを表示します。

この実装で、ファイルアップロードの基本的な機能とバリデーションを処理できます。
必要に応じて、ファイルの保存処理やエラーハンドリングも追加できます。