アンドロイドのあれこれ
[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
MultipartEntityによるサーバーへ画像ファイルを通信する
3日目です。さて開発の話に入ります。
去年はAndroidからHTTP通信でGET、POSTについて記事を書きましたが今回もHTTP通信の話になります。
画像ファイル(またはその他のファイル)をサーバーなどへPOSTする方法です。
apache-mime4jとhttpmimeというライブラリーを使います。
MultipartEntity.addPart(String name, ContentBody contentBody);
普通にテキストを送りたい場合、ContentBodyはStringBodyを使います。
サンプル
去年はAndroidからHTTP通信でGET、POSTについて記事を書きましたが今回もHTTP通信の話になります。
画像ファイル(またはその他のファイル)をサーバーなどへPOSTする方法です。
apache-mime4jとhttpmimeというライブラリーを使います。
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を使います。
サンプル
ですが、FileBodyだと引数がFile必須で、つまり画像のパスが必要です。
カメラで撮った写真ファイルや、端末に保存されている画像ファイルのパスならこのパターンでデータ送信できるが、
Googleアカウント同期してギャラリーに表示しているPicasaの写真を選ぶとうまくいかないので
(パスがcontent://com.google.android.gallery3d.provider/picasa/item/XXXXXXXのようなもの)
FileBodyではなく代わりに、InputStreamBodyを使います
サンプル
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