ブラウザーは、セキュリティ対策として、ファイル アップロード フィールドの自動復元を許可しません。検証でファイルが失われないようにするには、クライアント側ですべての検証を実行し (ただし、常にサーバーで再度検証する必要があります)、すべてが正しくなるまでフォームが送信されないようにするか、送信されたファイルを取得する必要があります。初めて、すべての検証が完了してフォームが最終的に到達するまで、それらを保持します。
この 2 番目のケースでは、いくつかのオプションがあります。
コンテンツをどこかに保存し、フォームを返すときに非表示フィールドに保持される一意の ID ポインターを返します。また、アップロード済みのファイルを示すラベルを表示することも検討する必要があります。あきらめて後で戻ってきたユーザーからアップロードを定期的にクリーンアップする必要があります (したがって、アップロードを照合するためにその相関 ID を使用してフォームを送信することはありません)。
Base64 は、アップロードされたファイルのコンテンツをエンコードし、それをビューの非表示フィールドに返します。これはより多くの帯域幅を消費しますが、適切な形式に関連付けられていないファイルをサーバーに保存する必要はありません。Base64 でエンコードされたイメージをイメージ タグ (または CSS 属性) のソースとして指定できるため、返されたビューに同じイメージを表示することもできます。これはブラウザ固有の可能性があります。
ファイルのアップロードのサイズが制限されている限り (たとえば 100kb)、オプション 2 が私の好みのアプローチです。これは、ページに含まれるすべての最新の JavaScript ライブラリよりもはるかに大きくなく、セッション、クリーンアップ、または過剰な処理をサーバーに任せながら、ユーザー エクスペリエンスを向上させます。
編集: 画像のアップロードを許可する多くのサイトでは、ファイル サイズの検証も提供され、サイズが大きすぎる場合はキックバックされます。この場合、ユーザーはアセットが保存されていないというフィードバックを受け取り、エンコードして返す必要はありません。
編集2:
これは、ファイル アップロード コントロールの値フィールドを読み取り専用としてマークし、これを JavaScript によって変更できないようにするブラウザーに関する投稿です (直接のユーザー アクションによってのみ変更できます)。
そして、HTMLでBase64でエンコードされた画像を直接使用することに関するSOコメントがあります。質問者はデータを別のファイルに入れる方法を探していますが、これはあなたが望むものではありません。「これが機能する」部分は、上記のオプション 2 で言及したものです。