ファイルアップロード(MultipartEntityBuilder)でNoSuchFieldError

Androidアプリで端末からの画像をアップロードする際に結構ハマったのでメモ。

org.apache.http.entity.mime.MultipartEntityBuilderでUPloadしようとすると「java.lang.NoSuchFieldError: org.apache.http.message.BasicHeaderValueFormatter.INSTANCE」
が発生。

ライブラリはApacheのhttpmime-4.5.jarを使っていたのですがあれこれ調べると「httpclient-android 4.3.5」も必要な感じ。

httpmime-4.5.jarと合わせてAndroidStudioのModule.appに設定。
これでOKかと思ったのですがまたまたエラー。どうやらそれぞれのライブラリの相性が悪いらしくhttpmime-4.5.jarをhttpclient-androidにあわせることに

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //省略
    //fileUploadではhttpclient-androidと:httpmime:4.3.5のバージョンを同じにしている方がいいみたい
    compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5'
    compile('org.apache.httpcomponents:httpmime:4.3.5') {
        exclude module: "httpclient"
    }
}

とりあえず解決。ちなみにAndroidでMultipartEntityBuilderを使ったファイルアップロードはこんな感じ

HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("enctype", "multipart/form-data");

MultipartEntityBuilder multiPartEntityBuilder = MultipartEntityBuilder.create();
multiPartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
multiPartEntityBuilder.setCharset(Charset.forName("UTF-8"));

File file = new File(filePath);
FileBody bin = new FileBody(file);
multiPartEntityBuilder.addPart("filedata", bin);

HttpEntity postEntity = multiPartEntityBuilder.build();
httpPost.setEntity(postEntity);