JavaのPartクラスのgetHeaderメソッドを徹底解説!初心者でもわかるServletでのヘッダー情報の取得方法
生徒
「JavaのServletでファイルをアップロードする処理を書いてるんですけど、ヘッダーの情報ってどうやって取るんですか?」
先生
「それなら、javax.servlet.http.PartインターフェースのgetHeaderメソッドを使うことで、アップロードされたファイルに付随するヘッダー情報を取得できますよ。」
生徒
「へぇ、Partって何ですか?getHeaderってどんなときに使うんですか?」
先生
「じゃあ、これからJava ServletのPartインターフェースと、getHeaderメソッドの使い方について順番に見ていきましょう!」
1. Java Servletとは?
JavaのServlet(サーブレット)は、Webアプリケーションを作成するための技術です。javax.servletパッケージに含まれていて、HTTPリクエストを受け取り、レスポンスを返す仕組みを提供します。フォームの送信やファイルアップロードなどの処理にも使われています。
2. javax.servlet.http.Partインターフェースとは?
javax.servlet.http.Partインターフェースは、Servlet 3.0から追加された機能で、マルチパートリクエスト(ファイルアップロードなど)を処理するために使います。
ユーザーがフォームでファイルを送信したとき、そのファイルはPartとしてServletに渡されます。
Partには、ファイルの名前やサイズ、MIMEタイプ、ヘッダーなどの情報が含まれています。
3. getHeaderメソッドの役割
PartインターフェースのgetHeader(String name)メソッドは、指定した名前のヘッダー情報を取得するために使います。
たとえば、ファイル名を取得したいときには、content-dispositionヘッダーを読み取ることで可能になります。
このメソッドを使うことで、アップロードされたファイルの情報を細かく確認できます。
4. getHeaderメソッドの使い方
Java Servletでマルチパートデータを扱う場合、@MultipartConfigアノテーションを使ってServletを設定し、request.getPart()メソッドでPartオブジェクトを取得します。その後getHeaderを使ってヘッダー情報を読み取ります。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@MultipartConfig
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Part filePart = request.getPart("file");
String header = filePart.getHeader("content-disposition");
response.setContentType("text/plain");
response.getWriter().println("ヘッダー情報: " + header);
}
}
5. ヘッダーからファイル名を取り出すには?
getHeaderで取得したcontent-dispositionには、ファイル名などが含まれています。ファイル名を取り出すには、ヘッダーの文字列を解析する必要があります。
String header = filePart.getHeader("content-disposition");
for (String cd : header.split(";")) {
if (cd.trim().startsWith("filename")) {
String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
System.out.println("ファイル名: " + fileName);
}
}
6. よく使われるヘッダーの種類
Partオブジェクトから取得できる代表的なヘッダーは以下のとおりです。
- content-disposition:ファイル名やフォームフィールド名の情報
- content-type:アップロードされたファイルのMIMEタイプ
- content-length:ファイルサイズ
7. getHeadersやgetHeaderNamesとの違い
getHeaderは1つのヘッダー値を返しますが、同じ名前のヘッダーが複数ある場合は、getHeaders(String name)で全ての値を取得することができます。また、getHeaderNames()を使えば利用可能な全ヘッダーの名前一覧が取得できます。
Collection<String> headers = filePart.getHeaderNames();
for (String name : headers) {
for (String value : filePart.getHeaders(name)) {
System.out.println(name + ": " + value);
}
}
8. Servletのファイルアップロードに必要な設定
ServletでPartを使うためには、以下の設定が必要です。
@MultipartConfigアノテーションをServletクラスに付けること- HTMLフォームに
enctype="multipart/form-data"を指定すること
HTMLフォームの例は次のようになります。
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">アップロード</button>
</form>