ごく普通の在日

AndroidでMultipartEntityによる画像ファイルをサーバーへPOSTする

すぐ使えるようにメモメモ
apache-mime4jhttpmimeというライブラリーを使ってHttpPost送る

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());
}
}
};
すぐ使えるようにメモメモ
apache-mime4jhttpmimeというライブラリーを使ってHttpPost送る

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());
}
}
};