Edited at

Android端末内の画像をアップロード

More than 1 year has passed since last update.


内容

別記事で書いた

Androidで端末内の画像を取得Android Httpでデータ取得

を組み合わせて、端末内の画像をアップロードします。

qiita_image_upload.gif


実装

MainActivity.javaは Androidで端末内の画像を取得 を一部変更します。

INTENT.ACTION_OPEN_DOCUMENT 戻りのonActivityResult にて AsyncTask を呼びます。

ParamはアップロードするURIとBitmapを指定します。


MainActivity.java

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


Param.java

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します。


PostBmpAsyncHttpRequest.java

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で保存して、メッセージを出力するだけのサーバー。

※毎回上書きです


index.php

$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