2016-03-30 17 views
4

いくつかのフォームパラメータをHTTPリクエスト(その1つがファイルです)を介してサーバーに送信する必要があります。だから、私は私が何とかを考え出す必要がある他の記事から理解Apache HTTPクライアント4フォーム投稿マルチパートデータ

the request was rejected because no multipart boundary was found 
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:954) 
at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331) 
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:351) 
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126) 
at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:156) 

...そう...

HttpPost httpPost = new HttpPost(urlStr); 

params = [] 
params.add(new BasicNameValuePair("username", "bond")); 
params.add(new BasicNameValuePair("password", "vesper")); 
params.add(new BasicNameValuePair("file", payload)); 

httpPost.setEntity(new UrlEncodedFormEntity(params)); 
httpPost.setHeader("Content-type", "multipart/form-data"); 

CloseableHttpResponse response = httpclient.execute(httpPost); 

サーバーがエラーを返したように、スタックトレースがあるのApache HTTPクライアントを使用します境界は、コンテンツには見つからない文字列です。しかし、私は上記のコードでこの境界をどのように作成するのですか?別のパラメータにする必要がありますか?ちょうどコードサンプルが私の必要なものです。

答えて

1

デフォルトそれは私が持っていた例外を処分したので、私は私が上だと思ったので、私はgustfの答えを受け入れそれは完全ではありませんでした。以下は、私が最終的に動作させるために行ったことです...

File payload = new File("/Users/CasinoRoyaleBank") 
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
entity.addPart("file", new FileBody(payload)) 
entity.addPart("username", new StringBody("bond")) 
entity.addPart("password", new StringBody("vesper")) 
httpPost.setEntity(entity); 
CloseableHttpResponse response = httpclient.execute(httpPost); 
+0

よろしいですか。申し訳ありませんが、あなたが答えを受け入れると、私はそれがあなたのために働いていると思いました。あなたの調査結果をもとに私の答えを更新します。 – gustf

+0

もう一度、ビルダーを使用する同等のコードで回答を更新しました。私はまた、元のコードとの違いをチェックしました:1) 'addPart(" file "、新しいFileBody(ペイロード)'を他の部分より前に置く2)charset、あなたのコードの非推奨のコンストラクタのデフォルトは 'ASCII'です。 。私のオリジナルでは、デフォルトは 'ISO_8859_1'です。これは通常どんな問題でもないはずですので、私の考えはそれが奇妙でも最初のものであるということです。しかし、多分これは 'MultipartHttpServletRequest'が動作する方法です、私は分かりません。これをテストする時間と時間があれば、それは素晴らしいことでしょう。 – gustf

8

例外として、「マルチパート境界」は指定していません。これは、要求の異なる部分間のセパレータとして機能する文字列です。しかし、あなたのケースでは、あなたは別の部分を処理していないようです。

あなたがおそらく使用したいのはMultipartEntityBuilderなので、そのすべてがどのようにボンネットの下で動作するか心配する必要はありません。

次の

 HttpPost httpPost = new HttpPost(urlStr); 

     File payload = new File("/Users/CasinoRoyaleBank"); 

     HttpEntity entity = MultipartEntityBuilder.create() 
       .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) 
       .addBinaryBody("file", payload) 
       .addTextBody("username", "bond") 
       .addTextBody("password", "vesper") 
       .build(); 
     httpPost.setEntity(entity); 

を行うには[OK]をする必要がありますが、ここでは以下の@AbuMariam知見とが、非推奨メソッド/コンストラクタを使用せずに適合するものでなければならないバージョンがあります。

 File payload = new File("/Users/CasinoRoyaleBank"); 

     ContentType plainAsciiContentType = ContentType.create("text/plain", Consts.ASCII); 
     HttpEntity entity = MultipartEntityBuilder.create() 
       .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) 
       .addPart("file", new FileBody(payload)) 
       .addPart("username", new StringBody("bond", plainAsciiContentType)) 
       .addPart("password", new StringBody("vesper", plainAsciiContentType)) 
       .build(); 
     httpPost.setEntity(entity); 

     CloseableHttpResponse response = httpclient.execute(httpPost); 

UrlEncodedFormEntityは、通常のマルチパートに使用されていない、そしてそれコンテンツタイプapplication/x-www-form-urlencoded

+0

あなたの提案は私がもはやエラーを起こさなかったという点で機能しました。しかし、重大な面では、私はそのデータを読んでいるとき、私はやっています.. .. MultipartHttpServletRequest multiRequest =(MultipartHttpServletRequest)request; CommonsMultipartFile file =(CommonsMultipartFile)multiRequest.getFile( "file");そして、ファイルはnullとして出てきます。 – AbuMariam

+0

'builder.addBinaryBody(String、File)'に関する答えを更新しました。しかし、私はあなたがすでにその1つを見たと思います。 – gustf

+1

2時間の複雑な解決策を探した後、なぜこれにはより多くの象徴がないのか分かりません。これは簡単で魅力的です。 stackoverflowでこのトピックのための最良の答え。 –