着信要求からデータを読み取り、解析する便利な方法はありますか。
例:クライアントが投稿リクエストを開始する
_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
_
着信リクエストを解析する最良の方法は何ですか?私は自分のパーサーを書きたくありません。おそらくすぐに使える解決策があるでしょう。
multipart/form-data
エンコードされたリクエストは、バージョン3.0以前のサーブレットAPIで実際にデフォルトでサポートされていません。サーブレットAPIは、デフォルトでapplication/x-www-form-urlencoded
エンコードを使用してパラメーターを解析します。別のエンコーディングを使用する場合、request.getParameter()
呼び出しはすべてnull
を返します。すでにサーブレット3.0を使用している場合( Glassfish 、 Tomcat 7 など)、 HttpServletRequest#getParts()
を使用できます。代わりに。また、拡張例については このブログ もご覧ください。
サーブレット3.0以前では、multipart/form-data
要求を解析するための de facto 標準は Apache Commons FileUpload を使用していました。 ユーザーガイドおよびよくある質問セクションを注意深く読んで、それを使用します。 here の前にコード例を使用して回答を投稿しました(サーブレット3.0を対象とした例も含まれています)。
ソリューション:
解決策A:
com.oreilly.servlet.MultipartRequest
でgetParameters()を呼び出します解決策B:
org.Apache.commons.fileupload.MultipartStream
でreadHeaders()を呼び出しますソリューションC:
解決策D:
Strutsを使用します。 Struts 1.1はこれを自動的に処理します。
アップロードの前に常にサーブレットがあるわけではありません(たとえば、フィルターを使用できます)。または、同じコントローラー(ここでもフィルターまたは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
}
}