##内容
別記事で書いた
Androidで端末内の画像を取得 と Android Httpでデータ取得
を組み合わせて、端末内の画像をアップロードします。
##実装
MainActivity.javaは Androidで端末内の画像を取得 を一部変更します。
INTENT.ACTION_OPEN_DOCUMENT 戻りのonActivityResult にて AsyncTask を呼びます。
ParamはアップロードするURIとBitmapを指定します。
try {
Bitmap bmp = getBitmapFromUri(uri);
imageView.setImageBitmap(bmp);
new PostBmpAsyncHttpRequest(self).execute(new Param("http://xxxx.xxxx/index.php", bmp));
} catch (IOException e) {
e.printStackTrace();
}
class Param {
public String uri;
public Bitmap bmp;
public Param(String uri, Bitmap bmp) {
this.uri = uri;
this.bmp = bmp;
}
}
AsyncTaskの実装は以下となります。
※AsyncTaskの説明は Android Httpでデータ取得 を参照
受け取ったParamのBitmapをjpeg形式でstreamに保存して、
指定URIにpostします。
public class PostBmpAsyncHttpRequest extends AsyncTask<Param, Void, String> {
private Activity mActivity;
public PostBmpAsyncHttpRequest(Activity activity) {
mActivity = activity;
}
@Override
protected String doInBackground(Param... params) {
Param param = params[0];
HttpURLConnection connection = null;
StringBuilder sb = new StringBuilder();
try {
// 画像をjpeg形式でstreamに保存
ByteArrayOutputStream jpg = new ByteArrayOutputStream();
param.bmp.compress(Bitmap.CompressFormat.JPEG, 100, jpg);
URL url = new URL(param.uri);
connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(3000);//接続タイムアウトを設定する。
connection.setReadTimeout(3000);//レスポンスデータ読み取りタイムアウトを設定する。
connection.setRequestMethod("POST");//HTTPのメソッドをPOSTに設定する。
//ヘッダーを設定する
connection.setRequestProperty("User-Agent", "Android");
connection.setRequestProperty("Content-Type","application/octet-stream");
connection.setDoInput(true);//リクエストのボディ送信を許可する
connection.setDoOutput(true);//レスポンスのボディ受信を許可する
connection.setUseCaches(false);//キャッシュを使用しない
connection.connect();
// データを投げる
OutputStream out = new BufferedOutputStream(connection.getOutputStream());
out.write(jpg.toByteArray());
out.flush();
// データを受け取る
InputStream is = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String line = "";
while ((line = reader.readLine()) != null)
sb.append(line);
is.close();
} catch (IOException e) {
e.printStackTrace();
} finally{
connection.disconnect();
}
return sb.toString();
}
public void onPostExecute(String string) {
// 戻り値をViewにセット
TextView textView = (TextView) mActivity.findViewById(R.id.textview);
textView.setText(string);
}
}
以下は呼ばれるサーバー側の処理となります。
リクエストのbody部を拡張子jpgで保存して、メッセージを出力するだけのサーバー。
※毎回上書きです
$data = file_get_contents("php://input");
$fp = fopen("/tmp/data.jpg", 'wb');
fwrite($fp, $data);
fclose($fp);
echo "Image Upload Finish.\n";
以上
###Developers
・Bitmap
https://developer.android.com/reference/android/graphics/Bitmap.html
・HttpURLConnection
https://developer.android.com/reference/java/net/HttpURLConnection.html