質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

2回答

2991閲覧

Spring Boot バリデーションによる入力エラー発生後にMultipartFileの値が保持できない

fu-mitsu8

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2022/07/27 08:42

前提

Spring Bootで画像ファイルのアップロードを含めた登録画面を作成しています。
FormクラスにMultipartFileの項目を用意し、アップロード用の値を保持しており、
登録処理を実行した際に、画像ファイルが選択されていたらサーバーへファイルをアップロードしています。

アップロードしたい画像を選択した状態で登録を実行し、何らかの項目でバリデーションによる
入力エラーが発生した際、エラーを直して再度登録を実行すると選択していた画像のFormクラスの
MultipartFileの値が保持できません。

実現したいこと

バリデーションによるエラー発生後もFormクラスのMultipartFileの値を保持したい。

該当のソースコード

HTML

1 2345 6<form th:action="@{/edit/}" th:object="${EditForm}" method="post" enctype="multipart/form-data" id="editForm"> 7 8 <button type="submit" class="" name="register" >Register</button> 9 10 <th>Attached File</th> 11 <td> 12 <label> 13 <input type="file" style="display: none;" th:field="*{attachedFile}" tabindex="135"></input> 14 <input type="text" maxlength="200" class="name80" readonly="readonly" th:field="*{attachFileNm}" th:errorclass="error-input" tabindex="136" /> 15 <button type="button" id="attachFileRef" tabindex="137">Select</button> 16 </label> 17 </td> 18 19202122 23</form> 24

Formクラス

1@Data 2@EqualsAndHashCode(callSuper=true) 3public class EditForm extends BaseEditForm implements Serializable { 4 5 @UploadFileNotEmpty(message="{E0078}") 6 @UploadFileMaxSize(value=1024 * 1024 * 30, message="{E0079}", size="30MB") 7 @FieldOrder(850) 8 private MultipartFile attachedFile; 9 10 private String attachFileNm; 11 12}

Controllerクラス

1@Controller 2public class EditController { 3 4 /** 5 * register(新規登録) 6 */ 7 @RequestMapping(value = "edit", params = "register", method = RequestMethod.POST) 8 public String register( 9 @ModelAttribute(value = "EditForm") @Validated EditForm editForm, 10 BindingResult bindingResult, 11 Model model) { 12 13 // チェック処理 14 if (bindingResult.hasErrors()) { 15 return "Edit"; 16 } 17 18 // チェック処理でエラー発生後、もう一度登録し直すと以下の値が取れなくなっている 19 editForm.getAttachedFile(); 20 21 // 以降、データの登録処理 22232425 26}

試したこと

Controllerクラスにてバリデーションによるエラーが無かった場合はFormの「attachedFile」の
値が正しく取得できており、画像のアップロードができているのですが、バリデーションによる
エラーが発生し、そのままもう一度登録を行うと、「attachedFile」の値が取れなくなります。

HTMLに「th:field="*{attachedFile}"」をhiddenで保持するようにしてみましたが、結果は同じでした。

上記のような状態で「attachedFile」の値を保持する方法があればご教示いただけませんでしょうか。

補足情報(FW/ツールのバージョンなど)

開発環境:Spring Boot 2.5.5 + Thymeleaf + Mybatis
Java(JDK):Java11

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

「できない仕様になっている」です。

https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/file
「注」の項を抜粋

1.スクリプトからファイル選択ダイアログの値を設定することはできません。 — 以下のようにしても効果はありません。
const input = document.querySelector("input[type=file]");
input.value = "foo";
2. <input type="file"> を使用してファイルが選択された場合、セキュリティ上の理由から、元のファイルへの実際のパスが value 属性上では見えないようになっています。その代わりに、ファイル名の先頭に C:\fakepath\ を追加したものが表示されます。この処置にはいくつかの経緯上の理由がありますが、すべての最新のブラウザーで対応されており、実際に仕様書で定義されています。

JavaScript上でチェックしたとしても、バリデーションエラー時には空にしておいたほうが良いです。
つまり、「毎回ユーザの意思で選択する」ものです。

投稿2022/07/27 09:54

編集2022/07/27 09:56
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fu-mitsu8

2022/07/28 01:59

早々にご回答いただきありがとうございます。 「できない仕様になっている」ということで理解できました。 JavaScript上でのチェックではなく、登録処理とは別でファイルをアップロードする機能を 実装する方向で検討してみます。
guest

0

昔から言われていますが画面の再描写が発生する場合、無理です。
https://atmarkit.itmedia.co.jp/bbs/phpBB/viewtopic.php?topic=1854&forum=7

入力チェックをajax等、非同期通信で行うなど
画面の再描写が発生しないように実施する必要があります。

投稿2022/07/27 09:11

Luice

総合スコア771

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fu-mitsu8

2022/07/28 01:51

早々にご回答いただきありがとうございます。 大変参考になりました。 既存のチェック処理の量や複雑さから、非同期での処理に今から変更するのは困難なため サイトに記載されているような「メッセージでその旨を伝える」といった対応にするか ファイルのアップロード処理だけを個別に実施できるような機能に変更するか検討したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問