Thymeleafでmultipart/form-dataを使用した実装

Thymeleafでmultipart/form-dataを使用した実装

Thymeleafでmultipart/form-dataを使用してファイルをアップロードする方法について、以下にソースコードの例を示します。
ここでは、ファイルアップロードを扱うために必要なコントローラの処理とバリデーションも含めています。

1. HTMLテンプレート (upload.html)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <title>ファイルアップロード</title>
</head>
<body>
  <h1>ファイルアップロードフォーム</h1>
  <form th:action="@{/upload}" method="post" enctype="multipart/form-data" th:object="${uploadForm}">
    <label for="file">ファイル:</label>
    <input type="file" id="file" name="file" th:field="*{file}" />
    <div th:if="${#fields.hasErrors('file')}" th:errors="*{file}">ファイルエラー</div>
    <button type="submit">アップロード</button>
  </form>
</body>
</html>

2. コントローラクラス (FileUploadController.java)

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.validation.Valid;
import org.springframework.validation.annotation.Validated;

@Controller
@RequestMapping("/upload")
public class FileUploadController {

  @RequestMapping
  public String showForm(UploadForm uploadForm) {
    return "upload";
  }

  @PostMapping
  public String handleFileUpload(
      @Valid @RequestPart("file") MultipartFile file,
      BindingResult result,
      RedirectAttributes redirectAttributes) {

    if (result.hasErrors()) {
      return "upload";
    }

    // ファイルの処理
    String fileName = file.getOriginalFilename();
    // ここにファイル保存処理を追加

    redirectAttributes.addFlashAttribute("message", "ファイルアップロード成功: " + fileName);
    return "redirect:/upload";
  }
}

3. フォームクラス (UploadForm.java)

import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.NotNull;

public class UploadForm {

  @NotNull(message = "ファイルは必須です")
  private MultipartFile file;

  public MultipartFile getFile() {
    return file;
  }

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

バリデーション

  • @NotNull アノテーションを使用して、ファイルが必須であることを示します。
  • BindingResult を用いて、ファイルアップロード時にエラーが発生した場合にはエラーメッセージを表示します。

このコード例では、multipart/form-data を使用してファイルアップロードを処理する基本的な構成を示しています。
フォームにファイルを選択し、アップロードボタンを押すことでファイルがサーバーに送信され、コントローラで処理されます。
ファイルの保存処理や追加のバリデーションが必要に応じて追加できます。