web-dev-qa-db-ja.com

サーブレット内の着信マルチパート/フォームデータパラメーターを解析する便利な方法

着信要求からデータを読み取り、解析する便利な方法はありますか。

例:クライアントが投稿リクエストを開始する

_URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
PrintWriter writer = null;
try {
    OutputStream output = connection.getOutputStream();
    writer = new PrintWriter(new OutputStreamWriter(output, charset), true); // true = autoFlush, important!
    // Send normal param.
    writer.println("--" + boundary);
    writer.println("Content-Disposition: form-data; name=\"param\"");
    writer.println("Content-Type: text/plain; charset=" + charset);
    writer.println();
    writer.println(param);
_

request.getParameter("paramName")を使用してparamを取得できません。次のコード

_BufferedReader reader = new BufferedReader(new InputStreamReader(
    request.getInputStream()));
  StringBuilder sb = new StringBuilder();
  for (String line; (line = reader.readLine()) != null;) {
   System.out.println(line);

  }
_

ただし、コンテンツは表示されます

_-----------------------------29772313742745
Content-Disposition: form-data; name="name"
J.Doe
-----------------------------29772313742745
Content-Disposition: form-data; name="email"
[email protected]
-----------------------------29772313742745
_

着信リクエストを解析する最良の方法は何ですか?私は自分のパーサーを書きたくありません。おそらくすぐに使える解決策があるでしょう。

62
atuser

multipart/form-dataエンコードされたリクエストは、バージョン3.0以前のサーブレットAPIで実際にデフォルトでサポートされていません。サーブレットAPIは、デフォルトでapplication/x-www-form-urlencodedエンコードを使用してパラメーターを解析します。別のエンコーディングを使用する場合、request.getParameter()呼び出しはすべてnullを返します。すでにサーブレット3.0を使用している場合( GlassfishTomcat 7 など)、 HttpServletRequest#getParts() を使用できます。代わりに。また、拡張例については このブログ もご覧ください。

サーブレット3.0以前では、multipart/form-data要求を解析するための de facto 標準は Apache Commons FileUpload を使用していました。 ユーザーガイドおよびよくある質問セクションを注意深く読んで、それを使用します。 here の前にコード例を使用して回答を投稿しました(サーブレット3.0を対象とした例も含まれています)。

77
BalusC

ソリューション:

解決策A:

  1. ダウンロード http://www.servlets.com/cos/index.html
  2. com.oreilly.servlet.MultipartRequestでgetParameters()を呼び出します

解決策B:

  1. ダウンロード http://jakarta.Apache.org/commons/fileupload/
  2. org.Apache.commons.fileupload.MultipartStreamでreadHeaders()を呼び出します

ソリューションC:

  1. ダウンロード http://users.boone.net/wbrameld/multipartformdata/
  2. Com.bigfoot.bugar.servlet.http.MultipartFormDataでgetParameterを呼び出します

解決策D:

Strutsを使用します。 Struts 1.1はこれを自動的に処理します。

参照: http://www.jguru.com/faq/view.jsp?EID=1045507

16
renura

アップロードの前に常にサーブレットがあるわけではありません(たとえば、フィルターを使用できます)。または、同じコントローラー(ここでもフィルターまたはservelt)が多くのアクションを処理できる可能性があるため、そのサーブレット構成に依存してgetPartメソッド(Servlet API> = 3.0のみ)を使用すると思います。 、好きじゃない。

一般に、私は単独で生活できる独立したソリューションを好みます。この場合、 http://commons.Apache.org/proper/commons-fileupload/ はその1つです。

List<FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
    for (FileItem item : multiparts) {
        if (!item.isFormField()) {
            //your operations on file
        } else {
            String name = item.getFieldName();
            String value = item.getString();
            //you operations on paramters
        }
}
6
Luca Rasconi