LoginSignup
18
33

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-03-01

内容

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

18
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
33