34
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

内容

別記事で書いた
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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
34
Help us understand the problem. What are the problem?