忍者ブログ

アンドロイドのあれこれ

MultipartEntityによるサーバーへ画像ファイルを通信する
3日目です。さて開発の話に入ります。
去年はAndroidからHTTP通信でGET、POSTについて記事を書きましたが今回もHTTP通信の話になります。
画像ファイル(またはその他のファイル)をサーバーなどへPOSTする方法です。
apache-mime4jhttpmimeというライブラリーを使います。

MultipartEntity.addPart(String name, ContentBody contentBody);

普通にテキストを送りたい場合、ContentBodyはStringBodyを使います。
サンプル
String postUrl = "http://www.sample.com/post.php";
HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(postUrl);
MultipartEntity entity = new MultipartEntity();
try {
entity.addPart("name", new StringBody("Name"));
entity.addPart("type", new StringBody("Type1"));

post.setEntity(entity);
HttpResponse response = httpClient.execute(post);
int status = response.getStatusLine().getStatusCode();

...(略)

端末の画像をサーバーへアップロードする場合、ContentBodyはFileBodyを使います。
サンプル
String postUrl = "http://www.sample.com/post.php";
HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(postUrl);
MultipartEntity entity = new MultipartEntity();
try {
File file = new File(imagePath);
entity.addPart("image", new FileBody(file.getAbsoluteFile()));

post.setEntity(entity);
HttpResponse response = httpClient.execute(post);
int status = response.getStatusLine().getStatusCode();

...(略)

ですが、FileBodyだと引数がFile必須で、つまり画像のパスが必要です。
カメラで撮った写真ファイルや、端末に保存されている画像ファイルのパスならこのパターンでデータ送信できるが、
Googleアカウント同期してギャラリーに表示しているPicasaの写真を選ぶとうまくいかないので
(パスがcontent://com.google.android.gallery3d.provider/picasa/item/XXXXXXXのようなもの)

FileBodyではなく代わりに、InputStreamBodyを使います
//ギャラリーの画像を選択したら
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
isOnLoading = true;
if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_PICK_CONTACT) {
if (data != null) {
imageUri = data.getData();
Thread thr = new Thread(reqUpload);
thr.start();
}
}
}
}

//画像をPOSTする
private Runnable reqUpload = new Runnable() {
@Override
public void run () {
String resp = null;
String postUrl = "http://www.sample.com/post.php";

InputStream inputStream = getContentResolver().openInputStream(imageUri);

HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(postUrl);
MultipartEntity entity = new MultipartEntity();
try {
InputStreamBody streamBody = new InputStreamBody(inputStream, "imagename");
entity.addPart("image", streamBody);
post.setEntity(entity);

HttpResponse response = httpClient.execute(post);
int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK){
ByteArrayOutputStream oStream = new ByteArrayOutputStream();
response.getEntity().writeTo(oStream);
resp = oStream.toString();
} else {
Log.v("ERR","response status:" + String.valueOf(status));
}
} catch(IOException e) {
Log.v("ERR","msg:" + e.getMessage());
}
}
};

COMMENT
NAME
TITLE
MAIL (非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS (コメント編集に必須です)
SECRET
管理人のみ閲覧できます
 
PR
© Android Advent
powered by 忍者ツールズ / 忍者ブログ / [PR]