HttpClient 4によるマルチパートアップロード
1概要
このチュートリアルでは、HttpClient 4を使ったマルチパートアップロード操作の方法を説明します。
テストサーバーとして
http://echo.200please.com
を使用します。これは一般に公開されており、ほとんどの種類のコンテンツを受け入れられるためです。
-
HttpClient
** リンクを使ってできる他の素晴らしいことを学びましょう。
2
AddPart
メソッドを使用する
まず、
MultipartEntityBuilder
オブジェクトを調べて、Httpエンティティにパーツを追加し、それをPOST操作でアップロードします。
これは、フォームを表す
HttpEntity
にパーツを追加するための一般的な方法です。
実施例2.1。 –
2つのテキスト部分と1つのファイルを含むフォームをアップロードする
File file = new File(textFileName);
HttpPost post = new HttpPost("http://echo.200please.com");
FileBody fileBody = new FileBody(file, ContentType.DEFAULT__BINARY);
StringBody stringBody1 = new StringBody("Message 1", ContentType.MULTIPART__FORM__DATA);
StringBody stringBody2 = new StringBody("Message 2", ContentType.MULTIPART__FORM__DATA);//
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER__COMPATIBLE);
builder.addPart("upfile", fileBody);
builder.addPart("text1", stringBody1);
builder.addPart("text2", stringBody2);
HttpEntity entity = builder.build();//post.setEntity(entity);
HttpResponse response = client.execute(post);
サーバーが使用する
ContentType
値も指定して、
File
オブジェクトをインスタンス化していることに注意してください。
また、
addPart
メソッドには2つの引数があり、フォームの
key/value
のペアのように機能します。これらは、サーバー側が実際にパラメータ名を想定して使用している場合にのみ関連します。
3
addBinaryBody
および
addTextBody
メソッドを使用する
マルチパートエンティティを作成するより直接的な方法は、
addBinaryBody
メソッドと
AddTextBody
メソッドを使用することです。これらのメソッドは、テキスト、ファイル、文字配列、および
InputStream
オブジェクトをアップロードするために機能します。
簡単な例でその方法を説明しましょう。
実施例3.1。 –
テキストとテキストファイルパートのアップロード
HttpPost post = new HttpPost("http://echo.200please.com");
File file = new File(textFileName);
String message = "This is a multipart post";
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER__COMPATIBLE);
builder.addBinaryBody("upfile", file, ContentType.DEFAULT__BINARY, textFileName);
builder.addTextBody("text", message, ContentType.DEFAULT__BINARY);//
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);
FileBody
および
StringBody
オブジェクトはここでは必要ないことに注意してください。
また重要なことに、ほとんどのサーバーはテキスト本文の
ContentType
をチェックしないので、
addTextBody
メソッドは
ContentType
値を省略することができます。
addBinaryBody
APIは
ContentType
を受け入れますが、バイナリ本体とファイルを保持するフォームパラメータの名前からエンティティを作成することもできます。前のセクションで述べたように、
ContentType
値が指定されていない場合、一部のサーバーはファイルを認識しません。
次に、zipファイルを
InputStream
として追加し、イメージファイルは
File
オブジェクトとして追加します。
実施例3.2。 –
__
Zipファイル、画像ファイル、およびテキストパートのアップロード
HttpPost post = new HttpPost("http://echo.200please.com");
InputStream inputStream = new FileInputStream(zipFileName);
File file = new File(imageFileName);
String message = "This is a multipart post";
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER__COMPATIBLE);
builder.addBinaryBody
("upfile", file, ContentType.DEFAULT__BINARY, imageFileName);
builder.addBinaryBody
("upstream", inputStream, ContentType.create("application/zip"), zipFileName);
builder.addTextBody("text", message, ContentType.TEXT__PLAIN);//
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);
上記のzipファイルの例の場合のように、
ContentType
値はその場で作成できます。
最後に、すべてのサーバーが
InputStream
部分を認識するわけではありません。コードの最初の行でインスタンス化したサーバーは
__InputStream
__sを認識します。
ここで、
addBinaryBody
がバイト配列を直接処理している別の例を見てみましょう。
実施例3.3。 –
バイト配列とテキストのアップロード
HttpPost post = new HttpPost("http://echo.200please.com");
String message = "This is a multipart post";
byte[]bytes = "binary code".getBytes(); //
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER__COMPATIBLE);
builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT__BINARY, textFileName);
builder.addTextBody("text", message, ContentType.TEXT__PLAIN);//
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);
ContentType
– バイナリデータを指定している – に注目してください。
4結論
この記事では、マルチパートフォームを作成するための複数のAPI選択を提供する柔軟なオブジェクトとして
MultipartEntityBuilder
を提示しました。
例では、フォームエンティティに似た
HttpEntity
をアップロードするための
HttpClient
の使用方法も示しています。
これらすべての例とコードスニペットの実装は、https://github.com/eugenp/tutorials/tree/master/httpclient#readme
にあります。
これはEclipseベースのプロジェクトです。そのままインポートして実行するのは簡単です。