参考
環境
Android4.0以上
mavenなし、eclipse Juno
用意するもの
以下のライブラリ(バージョンは2014/07/25現在のもの)
apahce-mime4j-core-0.7.2.jar
httpcore-4.3.2.jar
httpmine-4.3.4.jar
下2つはhttpcomponents-clientを落としてくれば、2つとも入ってます。
この3つのライブラリファイルをlibsフォルダに置くだけ。
ちなみに、mavenでもpomに記述すればOKなはずです。
送る画像の準備
ImageViewにセットしたかったので、Bitmap形式だったのをバイナリに変換してます。
// Bitmap形式をバイナリに変換
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 100, baos);
mImageData = baos.toByteArray();
// AsyncTaskManagerに通信させる
getLoaderManager().initLoader(0, null, updateAvaterHttpLoaderCallbacks);
本題
処理としては、いつものDefaultHttpClientのPOSTを使いますが、StringEntitiyではなく、MultipartEntityBuilder.create()を使うところがポイント。
ググった結果MultipartEntity使うやり方が大半だったんですが、参考元のサイトにある通り、4.3以上からはDeprecatedになってしまってます。
(いざやってみようと思ったら、Deprecatedで泣きそうになって参考元に辿り着いた笑)
引数がたくさんあるけど、それさえ乗り越えれば他のPOSTと代わりは特に無いですね。
送り先のサーバがRailsだったので、auth_tokenも一緒に送ってますが、ここは任意で変えれます。増やせます。Content-Typeもjsonになってますが、plainでもなんでもOKです。
/**
* 画像用POSTリクエスト
* @param url リクエスト先
* @param image 送信する画像(バイト配列)
* @param params 一緒に送るパラメータ
* @return
*/
public String postMultipart(String url, byte[] image, String params) {
HttpClient client = new DefaultHttpClient();
String str = "";
MultipartEntityBuilder entity = MultipartEntityBuilder.create();
entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
entity.setCharset(Charset.forName("UTF-8"));
try {
// 画像をセット
// 第一引数:パラメータ名
// 第二引数:画像データ
// 第三引数:画像のタイプ。jpegかpngかは自由
// 第四引数:画像ファイル名。ホントはContentProvider経由とかで取って来るべきなんだろうけど、今回は見えない部分なのでパス
entity.addBinaryBody("avater", image, ContentType.create("image/png"), "hoge.png");
url = "http://example.com/image.json";
// 画像以外のデータを送る場合はaddTextBodyを使う
ContentType textContentType = ContentType.create("application/json","UTF-8");
entity.addTextBody("auth_token", params, textContentType);
HttpPost post = new HttpPost(url);
post.setEntity(entity.build());
HttpResponse httpResponse = client.execute(post);
str = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
Log.i("HTTP status Line", httpResponse.getStatusLine().toString());
Log.i("HTTP response", new String(str));
} catch (ClientProtocolException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
return str;
}
感想
最初は自力でHttpConnection使ってやろうと思ったけど、画像ファイルのメタデータ追加とかも必要で、頭がこんがらがったのでおとなしく乗り換えることにしました。
ライブラリ様様ですね。アプリの容量がちょっとこわいけど。。