带有json的http multipart post请求和带有koush / ion库的图像

时间:2014-04-14 21:35:22

标签: java android ruby json http

我试图发布由图片 json对象参数"状态"组成的多部分数据从Android OS到Ruby rails服务器。 我正在做一个已完成的iOS应用程序的Android版本,因此服务器端可以工作。

但无论是否有任何库,我似乎无法在Android上使用它。

在服务器端,必须收到它才能正常工作。

 >>>> params: {"status"=>{"body"=>"Make love, not Warcraft. "}, 
"photo"=>#<ActionDispatch::Http::UploadedFile:0x007f36a89e5738 
@tempfile=#<Tempfile:/tmp/RackMultipart20140414-29241-gy4qeo>, @original_filename="iUEb2W9cnxG6", 
@content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"photo\"; 
filename=\"iUEb2W9cnxG6\"\r\nContent-Type: image/jpeg\r\n">, "format"=>"json", 
"action"=>"create", "controller"=>"api/statuses", "version"=>"1"}

但是当我这样做时,它不起作用。

JsonParser jp = new JsonParser();
JsonObject postbody = (JsonObject)jp.parse("{\"status\": { \"body\": \""+ text.getText().toString() +"\", \"venue\": null}}");

System.out.println("Start uploading image using Ion Library");


            Ion.with(it, The.url("/1/statuses"))
            .setHeader("uuid", The.uuid(it).toString())
            .setHeader("Content-Type","application/json")
            .setMultipartParameter("status", postbody.toString())
            .setMultipartFile("image", "image/jpeg", selectedFile)
            .asJsonObject()
            .setCallback(new FutureCallback<JsonObject>() {
               @Override
                public void onCompleted(Exception e, JsonObject result) {
                   System.out.println("Posted result "+ e + " " + result+ The.url("/1/statuses"));
               }});
            }

        }

我从服务器获得的内容基本上是解析错误。

I, [2014-04-14T17:21:01.411626 #29241]  INFO -- : Started POST "/1/statuses" for 64.179.216.50 at 2014-04-14 17:21:01 -0400
D, [2014-04-14T17:21:01.415493 #29241] DEBUG -- : Error occurred while parsing request parameters.
Contents:

------------------------------806fe35005b7480e81c10fc5c7ce33ef
Content-Disposition: form-data; name="status"

{"body":"i h8 u","venue":null}
------------------------------806fe35005b7480e81c10fc5c7ce33ef
Content-Disposition: form-data; name="photo"; filename="img.jpg"
Content-Type: image/jpeg

????E?ExifII*
?2?i???(SAMSUNGGT-I9500I9500UBUEMK12014:04:14 17:20:46HH?,??4"?'???0220?<?P?
d?l?
t?
|???    ?
??|?bH(???%??0100????8??(??? ?
                              <(?d2014:04:14 17:20:462014:04:14 17:20:46?d?d????d
?d?dASCIId?
           ?????????#??M?-?@??????????M?-?,??????????M?-???????????M?-???????????M?-????????????M?-????????????M?-???????????IJX??-д\?????X.p/???P?00?????/?BO?
                           ??
???????????????!?o??P???P??????
???
   ???0?@?A?0F???????????????@?
                               ?????????#??M?-?@??????????M?-?,??????????M?-???????????M?-???????????M?-????????????M?-????????????M?-???????????IJX??-д\?????X.p/???P?00?????/?BO?
                                               ??
???????????????!?o??P???P??????
???
   ???0?@?A?0F???????????????n)?p)?Ăf)?e)?g)?a)?h
A??i)???d)???u)???o)?O?x)??)???)???)???)?L??)???h?  (?A??c)??s)?
                                                                    ??)?#??)?(? pG??5?%?????? !??? ` !??@`` !????` !?`??`A?Y??? B???;???F?????????????????????????O?@p??
??M?@??(FP????*FhFP????jF(FO?????*FhFO?????jF(FO???|?*FhFO?????jF(FO???w?*FhFO???~?jF(FO???r?*FhFO???{?jF(FO???m?*FhFO???z?jF(FO???h?*FhFO???w?jF(FO???c?*FhFO??u?jF(FO??^?*FhFO??r?jF(FO??qH?X?O.

在过去的8个小时里,我试过没有图书馆和各种各样的东西,并且研究了很长时间。我仍然觉得我错过了一些如此简单和明显的东西但是到目前为止我还没有完成很多图像发布请求......任何有任何图书馆的解决方案都将受到赞赏。

编辑:.setBodyParameter(....)是一个拼写错误并修复为.setMultipartParameter(...) 这就是导致这个结果的代码。 如果有人可以给我一段能够做我想做的事情的代码,那么我将非常感激。 谢谢你上网!

2 个答案:

答案 0 :(得分:2)

代替setBodyParameter,使用set setMultipartParameter。我不确定你是如何调用它的,因为我不会在我的头上编译。

您使用的是什么版本的离子?有一个修复程序在一个月前删除多部分有效负载中无关的CRLF:

https://github.com/koush/AndroidAsync/commit/efb6c018bd15060e44086d4f76c3d419d26065ba

答案 1 :(得分:0)

我遇到了同样的问题;

而不是设置multipart文件; ... .setMultipartFile(“image”,“image / jpeg”,fileToUpload)

设置文件解决了我的问题。 ... .setFileBody(fileToUpload)