如何使用Retrofit发送图像文件(@Fields)

时间:2016-12-02 07:12:19

标签: android retrofit2 multipart

我在@Fields使用@FormUrlEncoded数据,但我必须在同一个API @Part("user_image") RequestBody file中使用@Multipart。怎么可能?提前致谢。

@FormUrlEncoded
@POST("/datingapp/index.php/Webservice")
Call<Result> signupUser(@Field("user_name") String name,
                             @Field("age") String age,
                             @Field("work") String work,
                             @Field("home_town") String home_town,
                             @Field("gender") String gender,
                             @Field("interest") String interest,
                             @Field("study") String study,
                             @Field("email") String email,
                             @Field("password") String password,
                             @Field("device_id") String device_id,
                             @Field("device_type") String device_type,
                             @Part("user_image") RequestBody file,
                             @Field("signup") String signup); 

3 个答案:

答案 0 :(得分:6)

Http协议不允许2个Content-Type在同一个请求中。所以你必须选择:

  • 应用程序/ x-WWW窗体-urlencoded
  • 的multipart / form-data的

您可以使用注释application/x-www-form-urlencoded@FormUrlEncoded发送图片,以便将整个文件转换为文本(例如base64)。

更好的方法是使用multipart/form-data来描述您的请求:

@Multipart
@POST("/datingapp/index.php/Webservice")
Call<Result> signupUser(@Part("user_name") String name,
                         @Part("age") String age,
                         @Part("work") String work,
                         @Part("home_town") String home_town,
                         @Part("gender") String gender,
                         @Part("interest") String interest,
                         @Part("study") String study,
                         @Part("email") String email,
                         @Part("password") String password,
                         @Part("device_id") String device_id,
                         @Part("device_type") String device_type,
                         @Part("user_image") RequestBody file,
                         @Part("signup") String signup); 

答案 1 :(得分:0)

@Multipart
@POST("/datingapp/index.php/Webservice")
Call<Result> signupUser(@PartMap Map<String,String> queryMap,
                             @Part("user_image") RequestBody file); 

此处@PartMap包含所需的其他参数,这些参数只是包含密钥和值的HashMap,例如

LinkedHashMap<String,String> map = new LinkedHashMap<String,String>();
map.put("user_name",username);

喜欢上面等等。

答案 2 :(得分:-2)

像这样打电话给api:

@POST("/datingapp/index.php/Webservice")
@FormUrlEncoded
@Multipart
Call<Result> signupUser(@FieldMap LinkedHashMap<String, String> data,@Part RequestBody file);

并传递您的数据是LinkedHashMap中的键和值的形式

LinkedHashMap<String, String> data = new LinkedHashMap<>();
data.put("user_name", user_name);
data.put("age", age);
data.put("work", work);
data.put("work", work);
data.put("gender", gender); and so on ....

获取Multiparts中的图片:

RequestBody file= RequestBody.create(MediaType.parse("image/jpeg"), file);
最后打电话给api:

Call<Result> call = apiService.signupUser(data ,file);

希望这有效:)