LoginSignup
55
54

More than 5 years have passed since last update.

[Android]画像をPOST通信で送信する

Posted at

参考

androidアプリで画像をサーバーに送る

環境

Android4.0以上
mavenなし、eclipse Juno

用意するもの

以下のライブラリ(バージョンは2014/07/25現在のもの)
apahce-mime4j-core-0.7.2.jar
httpcore-4.3.2.jar
httpmine-4.3.4.jar
下2つはhttpcomponents-clientを落としてくれば、2つとも入ってます。

この3つのライブラリファイルをlibsフォルダに置くだけ。
ちなみに、mavenでもpomに記述すればOKなはずです。

送る画像の準備

ImageViewにセットしたかったので、Bitmap形式だったのをバイナリに変換してます。

xxxFragment.java
            // Bitmap形式をバイナリに変換
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(CompressFormat.PNG, 100, baos);
            mImageData = baos.toByteArray();
            // AsyncTaskManagerに通信させる
            getLoaderManager().initLoader(0, null, updateAvaterHttpLoaderCallbacks);

本題

処理としては、いつものDefaultHttpClientのPOSTを使いますが、StringEntitiyではなく、MultipartEntityBuilder.create()を使うところがポイント。
ググった結果MultipartEntity使うやり方が大半だったんですが、参考元のサイトにある通り、4.3以上からはDeprecatedになってしまってます。
(いざやってみようと思ったら、Deprecatedで泣きそうになって参考元に辿り着いた笑)
引数がたくさんあるけど、それさえ乗り越えれば他のPOSTと代わりは特に無いですね。

送り先のサーバがRailsだったので、auth_tokenも一緒に送ってますが、ここは任意で変えれます。増やせます。Content-Typeもjsonになってますが、plainでもなんでもOKです。

    /** 
     * 画像用POSTリクエスト
     * @param url リクエスト先
     * @param image 送信する画像(バイト配列)
     * @param params 一緒に送るパラメータ
     * @return
     */

    public String postMultipart(String url, byte[] image, String params) {
        HttpClient client = new DefaultHttpClient();
        String str = "";

        MultipartEntityBuilder entity = MultipartEntityBuilder.create();
        entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        entity.setCharset(Charset.forName("UTF-8"));
        try {
            // 画像をセット
            // 第一引数:パラメータ名
            // 第二引数:画像データ
            // 第三引数:画像のタイプ。jpegかpngかは自由
            // 第四引数:画像ファイル名。ホントはContentProvider経由とかで取って来るべきなんだろうけど、今回は見えない部分なのでパス
            entity.addBinaryBody("avater", image, ContentType.create("image/png"), "hoge.png");
            url = "http://example.com/image.json";

            // 画像以外のデータを送る場合はaddTextBodyを使う
            ContentType textContentType = ContentType.create("application/json","UTF-8");
            entity.addTextBody("auth_token", params, textContentType);

            HttpPost post = new HttpPost(url);
            post.setEntity(entity.build());

            HttpResponse httpResponse = client.execute(post);
            str = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
            Log.i("HTTP status Line", httpResponse.getStatusLine().toString());
            Log.i("HTTP response", new String(str));
        } catch (ClientProtocolException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return str;
    }

感想

最初は自力でHttpConnection使ってやろうと思ったけど、画像ファイルのメタデータ追加とかも必要で、頭がこんがらがったのでおとなしく乗り換えることにしました。
ライブラリ様様ですね。アプリの容量がちょっとこわいけど。。

55
54
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
55
54