ApacheHttpClientを使用したマルチパートアップロード
1. 概要
このチュートリアルでは、HttpClientを使用してマルチパートアップロード操作を実行する方法を説明します。
http://echo.200please.com は公開されており、ほとんどの種類のコンテンツを受け入れるため、テストサーバーとして使用します。
もっと深く掘り下げたいなら HttpClientでできる他のクールなことを学ぶ –に向かいます メインの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値を省略できます。
addBinaryBodyAPIは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を認識します。
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. 結論
この記事では、 MultipartEntityBuilder を、マルチパートフォームを作成するための複数のAPIの選択肢を提供する柔軟なオブジェクトとして紹介しました。
例では、 HttpClient を使用して、フォームエンティティに類似した aHttpEntityをアップロードする方法も示しています。
これらすべての例とコードスニペットの実装は、GitHubプロジェクトにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。