2015年2月27日金曜日

[安藤]android + apache http multipart post

如果你要使用http post一次上傳檔案,檔名跟一些檔案相關文字資訊的話,
http multipart post是必經之路。很可惜白痴的,android os內建的httpclient
並沒有包含到MultipartEntity/MultipartEntityBuilder。


所以第一步是找到合用的httpclient lib來用。
apache網站上面目前的最新版4.4的lib 匯入之後雖然可以編譯,但是執行的時候會跑nosuchmethodexception.
因此請下載目前可用的最終版4.3.6。
http://archive.apache.org/dist/httpcomponents/httpclient/binary/httpcomponents-client-4.3.6-bin.zip

下面是程式碼。

HttpPost post = new HttpPost(queryString(url, null));
post.addHeader("Connection", "Keep-Alive");
post.addHeader("Charset", HTTP.UTF_8);

try {
MultipartEntityBuilder builder = MultipartEntityBuilder.create();        
    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    builder.setCharset(Charset.forName(HTTP.UTF_8));
    builder.addBinaryBody("file", file, ContentType.create("image/png"), file.getName());  //要傳檔案的話請這樣用。content-type要自行製作。本例的是傳png檔案。或是強制填入泛用的「binary/octet-stream」似乎也可以。反正server端的重點是拿來存檔...
    builder.addTextBody("param1", param1);
    builder.addTextBody("param2", param2);  //要傳文字參數的話請這樣用。


    post.setEntity(builder.build());
    HttpResponse response = client.execute(post);
    String serverResponse = EntityUtils.toString(response.getEntity()); //看看server回傳的是不是成功。有的server會把結果以gzip encode之後再送,請自行判斷response的encodetype。
    }
    catch (Exception e) {e.printStackTrace();}



0 件のコメント:

コメントを投稿