JavaのPart.getSubmittedFileNameメソッドの使い方を徹底解説!初心者でもわかるファイル名の取得方法
生徒
「先生、アップロードされたファイルの名前ってJavaでどうやって取り出すんですか?」
先生
「いい質問ですね。javax.servlet.http.PartのgetSubmittedFileName()メソッドを使えば、アップロード時のファイル名を取得できますよ。」
生徒
「それって、ユーザーが選んだファイル名そのままなんですか?」
先生
「その通りです!それでは実際にどんなときに使うか見てみましょう。」
1. getSubmittedFileNameメソッドとは
Part.getSubmittedFileName()は、ユーザーがアップロードしたファイルのファイル名(フルパスではなく名前のみ)を取得するためのメソッドです。
このメソッドは、ファイルアップロード時に使われ、サーバー側でログ出力やファイル名のチェック、保存処理などに活用されます。
2. 実際のHTMLフォーム例
HTMLのフォームでファイルをアップロードする場合は、以下のように記述します:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile">
<button type="submit">アップロード</button>
</form>
3. Servletでファイル名を取得するサンプルコード
以下は、JavaのServletでアップロードされたファイルのファイル名を取得して表示する例です:
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Part filePart = request.getPart("uploadFile");
String fileName = filePart.getSubmittedFileName();
System.out.println("アップロードされたファイル名: " + fileName);
}
}
4. getSubmittedFileNameの用途と注意点
getSubmittedFileName()は便利なメソッドですが、以下の点に注意が必要です:
- ブラウザやOSによっては、ファイル名にパスが含まれていることもある
- ユーザーが悪意あるファイル名(../など)を設定することも可能
- ファイル名のバリデーションやサニタイズ処理を必ず行うべき
5. ファイル保存時の名前処理の例
取得したファイル名をそのまま保存するのは危険です。保存時は一意のIDやタイムスタンプと組み合わせて、ファイル名の衝突や上書きを防ぐ方法が推奨されます。
String fileName = filePart.getSubmittedFileName();
String safeFileName = UUID.randomUUID().toString() + "_" + fileName;
filePart.write("/upload/dir/" + safeFileName);
6. getNameとの違いを理解しよう
getSubmittedFileName()とgetName()は名前が似ていますが、用途は異なります:
- getSubmittedFileName():実際にアップロードされたファイルの名前(例:
cat.png) - getName():フォームで指定されたinput要素の
name属性(例:uploadFile)
まとめ
本記事では、Javaのサーブレットにおけるファイルアップロード処理の中でも、特に使用頻度が高く、実務でも重要となるPart.getSubmittedFileNameメソッドについて詳しく解説してきました。ファイルアップロードは、多くのWebアプリケーションで利用される基本機能ですが、実装方法を正しく理解していないと、思わぬ不具合やセキュリティリスクにつながる可能性があります。その中で、アップロードされたファイル名をどのように取得し、どのように扱うかは、初心者だけでなく経験者にとっても再確認しておきたいポイントです。
getSubmittedFileNameメソッドは、ユーザーがフォームで選択したファイルの名前を取得するための仕組みであり、ログ出力、拡張子チェック、保存時の名前生成など、さまざまな場面で活用されます。一方で、取得できるファイル名はユーザー入力に近い情報であるため、そのまま信用して処理を進めるのは危険です。記事内で紹介したように、パス情報が含まれるケースや、不正な文字列が含まれる可能性を考慮し、必ずバリデーションやサニタイズを行うことが重要です。
また、getNameメソッドとの違いを理解することで、フォーム項目名と実際のファイル名を混同せずに済みます。これを正しく理解しているかどうかで、サーブレットのコードの読みやすさや保守性にも大きな差が出てきます。さらに、UUIDやタイムスタンプを利用した安全なファイル名生成の考え方は、実務レベルのアプリケーション開発ではほぼ必須の知識といえるでしょう。
以下では、これまで学んだ内容を整理するために、改めてサンプルプログラムを確認し、その後に先生と生徒の会話形式で理解を深めていきます。記事全体を通して、ファイルアップロード処理の流れと、Part.getSubmittedFileNameの役割が自然につながるように振り返ってみてください。
サンプルプログラムで振り返るポイント
ここでは、まとめとしてシンプルなサーブレットのコード例を再度確認します。基本構造は記事中で紹介したものと同じで、HttpServlet、@WebServlet、@MultipartConfigを利用した構成です。重要なのは、ファイル名を取得したあとに、その扱い方を意識することです。
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Part filePart = request.getPart("uploadFile");
String originalFileName = filePart.getSubmittedFileName();
String safeFileName = UUID.randomUUID().toString() + "_" + originalFileName;
filePart.write("/upload/dir/" + safeFileName);
System.out.println("保存されたファイル名: " + safeFileName);
}
}
このように、getSubmittedFileNameで取得した値は、そのまま使うのではなく、安全な形に加工してから保存するのが基本です。この考え方を身につけておくことで、ファイルアップロード機能を安心して実装できるようになります。
生徒
「今回の記事を通して、ファイル名を取得するだけでも、いろいろ注意点があることが分かりました。」
先生
「そうですね。Part.getSubmittedFileNameはとても便利ですが、ユーザーが入力した情報だという意識が大切です。」
生徒
「最初は、取得したファイル名をそのまま保存すればいいと思っていました。」
先生
「初心者のうちは、そう考えがちです。でも、ファイル名の衝突や不正な文字列を防ぐために、UUIDを使う方法などを覚えておくと安心ですね。」
生徒
「あと、getNameとの違いも、今ならはっきり説明できそうです。」
先生
「それは良い理解です。フォームのname属性と、実際のファイル名は別物だと意識できれば、サーブレットの処理も整理しやすくなります。」
生徒
「ファイルアップロード処理が、前よりも身近に感じられるようになりました。」
先生
「その感覚を大事にしてください。今回学んだ内容は、実務でもよく使うので、ぜひ何度も書いて体に覚えさせていきましょう。」