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

##内容

別記事で書いた
[Androidで端末内の画像を取得](http://qiita.com/yamikoo@github/items/2a40f93509f4154ccd48) と [Android Httpでデータ取得](http://qiita.com/yamikoo@github/items/fe27482954cd73e55935)
を組み合わせて、端末内の画像をアップロードします。

![qiita_image_upload.gif](https://qiita-image-store.s3.amazonaws.com/0/15564/f953df73-ee6e-c463-216f-95700ad7e9a1.gif)



##実装

MainActivity.javaは　[Androidで端末内の画像を取得](http://qiita.com/yamikoo@github/items/2a40f93509f4154ccd48)　を一部変更します。
INTENT.ACTION_OPEN_DOCUMENT　戻りのonActivityResult　にて　AsyncTask　を呼びます。
ParamはアップロードするURIとBitmapを指定します。

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

```java: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でデータ取得](http://qiita.com/yamikoo@github/items/fe27482954cd73e55935)　を参照

受け取ったParamのBitmapをjpeg形式でstreamに保存して、
指定URIにpostします。

```java: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で保存して、メッセージを出力するだけのサーバー。
※毎回上書きです

```php: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