{"id":247,"date":"2016-12-30T09:20:47","date_gmt":"2016-12-30T09:20:47","guid":{"rendered":"https:\/\/boochlin.com\/?p=247"},"modified":"2017-01-09T08:32:02","modified_gmt":"2017-01-09T08:32:02","slug":"%e5%a4%a7%e5%ae%b6%e5%a5%bd%ef%bc%8c%e6%a8%99%e9%a1%8c%e5%95%a5%e9%ac%bc%e7%9a%84%e5%ae%8c%e5%85%a8%e9%82%84%e6%b2%92%e6%83%b3%e5%88%b0","status":"publish","type":"post","link":"https:\/\/boochlin.com\/?p=247","title":{"rendered":"Retrofit 2 \u2014 How to Upload Files and Parameter list to Server"},"content":{"rendered":"<p>Retrofit 2<\/p>\n<p>\u4e00\u500b\u4e45\u805e\u5927\u540d\u7684\u7db2\u8def\u64cd\u4f5c\u6846\u67b6\uff0c\u57fa\u65bc OKHTTP3 \u5728\u5305\u88dd\uff0c\u7528\u8d77\u4f86\u633a\u8212\u723d\u7684\uff0c\u4e4b\u524d\u90fd\u662f\u4f7f\u7528 VOLLEY \u4f5c\u70ba\u4e3b\u8981\u5de5\u5177\uff0c\u5404\u6709\u512a\u7f3a\u9ede\uff0c\u5c01\u88dd\u6982\u5ff5\u4e0d\u540c\u3002\u5c0d\u65bc Retrofit \u4e0a\u50b3\u6a94\u6848\u4e0d\u719f\uff0c\u56e0\u6b64\u50c5\u50c5\u662f\u4f5c\u7b46\u8a18\u3002<\/p>\n<p><!--more--><\/p>\n<p><a href=\"https:\/\/futurestud.io\/tutorials\/retrofit-2-how-to-upload-files-to-server\">\u4e00\u6b21\u4e0a\u50b3\u4e00\u4efd\u6a94\u6848<\/a><\/p>\n<p><a href=\"https:\/\/futurestud.io\/tutorials\/retrofit-2-how-to-upload-multiple-files-to-server\">\u4e00\u6b21\u4e0a\u50b3\u591a\u4efd\u6a94\u6848<\/a><\/p>\n<p><a href=\"https:\/\/futurestud.io\/tutorials\/retrofit-2-passing-multiple-parts-along-a-file-with-partmap\">\u540c\u6642\u4e0a\u50b3\u6a94\u6848\u8ddf\u53c3\u6578<\/a><\/p>\n<p>\u5176\u5be6\u4e0a\u9762\u5c31\u5df2\u7d93\u8db3\u5920\u5145\u5206\uff0c\u800c\u6211\u7684\u9700\u6c42\u5247\u662f\u540c\u6642\u5728\u52a0\u4e0a string list \u53c3\u6578\u4e0a\u50b3<\/p>\n<p>retrofit2 \u8a3b\u89e3\u5c01\u88dd<\/p>\n<pre>        @Multipart\r\n        @POST(\"\/poll\")\r\n        Call createVote(@PartMap Map&lt;String, RequestBody&gt; parametor,\r\n                                  @Part(\"description\") RequestBody description,\r\n                                  @Part MultipartBody.Part file\r\n\r\n        );\r\n<\/pre>\n<p>Android client code<\/p>\n<pre>public void createVote(VoteData voteSetting, List options, File image\r\n            , VoteDataManager.createVoteResponseCallback callback) {\r\n\r\n\r\n        Map&lt;String, RequestBody&gt; parameter = new HashMap&lt;&gt;();\r\n\r\n        RequestBody title = RequestBody.create(MediaType.parse(\"text\/plain\"), voteSetting.getTitle());\r\n        RequestBody maxOption = RequestBody.create(MediaType.parse(\"text\/plain\"), String.valueOf(voteSetting.getMaxOption()));\r\n        RequestBody minOption = RequestBody.create(MediaType.parse(\"text\/plain\"), String.valueOf(voteSetting.getMinOption()));\r\n        RequestBody userCanAddOption = RequestBody.create(MediaType.parse(\"text\/plain\")\r\n                , String.valueOf(voteSetting.getIsUserCanAddOption()));\r\n        RequestBody userPanPreviewResult = RequestBody.create(MediaType.parse(\"text\/plain\")\r\n                , String.valueOf(voteSetting.getIsCanPreviewResult()));\r\n        RequestBody security = RequestBody.create(MediaType.parse(\"text\/plain\")\r\n                , VoteData.SECURITY_PUBLIC);\r\n        RequestBody category = RequestBody.create(MediaType.parse(\"text\/plain\"), String.valueOf(voteSetting.getCategory()));\r\n        RequestBody startTime = RequestBody.create(MediaType.parse(\"text\/plain\"), String.valueOf(voteSetting.getStartTime()));\r\n        RequestBody endTime = RequestBody.create(MediaType.parse(\"text\/plain\"), String.valueOf(voteSetting.getEndTime()));\r\n\r\n        RequestBody rbOption;\r\n        \/\/ STRING LIST PARAMETOR\r\n        for (int i = 0; i &lt; options.size(); i++) {\r\n            rbOption = RequestBody.create(MediaType.parse(\"text\/plain\"), options.get(i));\r\n            parameter.put(\"pt[\" + i + \"]\", rbOption);\r\n        }\r\n\r\n        parameter.put(\"t\", title);\r\n        parameter.put(\"max\", maxOption);\r\n        parameter.put(\"min\", minOption);\r\n        parameter.put(\"add\", userCanAddOption);\r\n        parameter.put(\"res\", userPanPreviewResult);\r\n        parameter.put(\"sec\", security);\r\n        parameter.put(\"cat\", category);\r\n        parameter.put(\"on\", startTime);\r\n        parameter.put(\"off\", endTime);\r\n\r\n        if (voteSetting.getIsNeedPassword()) {\r\n            RequestBody password = RequestBody.create(MediaType.parse(\"text\/plain\"), voteSetting.password);\r\n            parameter.put(\"p\", password);\r\n        }\r\n\r\n        RequestBody requestFile = null;\r\n        MultipartBody.Part body = null;\r\n        String descriptionString = \"vote_image\";\r\n        RequestBody description = null;\r\n\r\n        if (image != null) {\r\n            requestFile = RequestBody.create(MediaType.parse(\"multipart\/form-data\"), image);\r\n            body = MultipartBody.Part.createFormData(\"i\", image.getName(), requestFile);\r\n            description = RequestBody.create(\r\n                    MediaType.parse(\"multipart\/form-data\"), descriptionString);\r\n        }\r\n\r\n        Call call = voteService.createVote(parameter, description, body);\r\n        call.enqueue(callback);\r\n    }\r\n<\/pre>\n<p>\u96d6\u7136\u4e0a\u9762\u9019\u6a23\u5beb\u597d\u50cf\u5f88\u8822\uff0c\u4f46\u4e00\u6642\u9593\u4e5f\u627e\u4e0d\u5230\u600e\u67d0\u5beb\uff0c<br \/>\n\u5982\u679c\u6709\u8208\u8da3\u7684\u4eba\uff0c\u61c9\u8a72\u8981\u66f4\u52a0\u9032\u4e00\u6b65\u7406\u89e3 multipart\/form-data<\/p>\n<p>\u6700\u8fd1\u5be6\u5728\u662f\u592a\u5fd9\uff0c\u6587\u7ae0\u8cea\u91cf\u63d0\u6607\u4e0d\u8d77\u4f86<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Retrofit 2 \u4e00\u500b\u4e45\u805e\u5927\u540d\u7684\u7db2\u8def\u64cd\u4f5c\u6846\u67b6\uff0c\u57fa\u65bc OKHTTP3 \u5728\u5305\u88dd\uff0c\u7528\u8d77\u4f86\u633a\u8212\u723d\u7684\uff0c\u4e4b\u524d\u90fd\u662f\u4f7f\u7528 VOLLEY \u4f5c\u70ba\u4e3b\u8981\u5de5\u5177\uff0c\u5404\u6709\u512a\u7f3a\u9ede\uff0c\u5c01\u88dd\u6982\u5ff5\u4e0d\u540c\u3002\u5c0d\u65bc Retrofit \u4e0a\u50b3\u6a94\u6848\u4e0d\u719f&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[50,36,52,64],"tags":[6,15,65],"_links":{"self":[{"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/posts\/247"}],"collection":[{"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=247"}],"version-history":[{"count":0,"href":"https:\/\/boochlin.com\/index.php?rest_route=\/wp\/v2\/posts\/247\/revisions"}],"wp:attachment":[{"href":"https:\/\/boochlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=247"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=247"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/boochlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=247"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}