使用 Retrofit 上传 JSON 格式的多部分图像数据?

Posted

技术标签:

【中文标题】使用 Retrofit 上传 JSON 格式的多部分图像数据?【英文标题】:Upload multipart image data in JSON with Retrofit? 【发布时间】:2014-08-01 16:03:13 【问题描述】:

我想使用此 JSON 正文(包含图片)和 Retrofit 执行 PUT 请求。我在android下使用它:


    "Request": 
        "data": 
            "Key": "keydata",
            "param": 
                "title": "Testingpostmultipartimageupload",
                "photo": **"IMAGE BYTE DATA"**
            
        
    

有什么线索吗?

【问题讨论】:

我在改造 2 中执行此操作时遇到问题。我可以知道如何在改造 2 中执行此操作吗? 我使用的是改造 1.6。我今晚会检查改造 2。 谢谢@Patrick。这对我会有帮助。 【参考方案1】:

好的,我找到了一个使用 multipart 的解决方案,类似于:

@Multipart
@PUT("/users/id")
void modifyPic(
    @Header("auth_token") String token,
    @Path("id") int userid,
    @Part("request[data][param][title]") String title,
    @Part("request[data][param][Photo]") TypedFile avatar,
    Callback<User> cb
);

【讨论】:

如何填写对象的其他字段? (例如标题) 您只需添加 @Part("request[data][param][title]") 字符串标题。我将编辑我的答案以设置完整的答案。 谢谢!除了文件的字段之外,它是否必须是其他字段的@Part 注释? 是的,这个解决方案需要为每个字段使用@Part。 @Patrick 你能指出我尝试send an image with JSON data in one request 的解决方案吗?【参考方案2】:

您需要使用多部分表单数据将图像数据放入字节中。

try 
    HttpPost httppost = new HttpPost("some url");
    MultipartEntity multipartEntity = 
        new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);  
    multipartEntity.addPart("Image", new FileBody(image));
    httppost.setEntity(multipartEntity);
    mHttpClient.execute(httppost, new YOURHANDLER());
 catch (Exception e) 
    Log.e(ServerCommunication.class.getName(), e.getLocalizedMessage(), e);

使用参数发送post请求

HttpPost httpPost = new HttpPost(url);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

if (values != null) 
    for (Map.Entry<String, String> entry : values.entrySet()) 
        nameValuePairs.add(
            new BasicNameValuePair(entry.getKey(), entry.getValue()));
    
    httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));

【讨论】:

谢谢。你如何添加到整个 json 对象?顺便说一句,我正在尝试使用 Retrofit lib 来做到这一点。 您不能发送 json 对象,除非您的服务器接受 json 字符串并将其解析为对象。通常发布请求是使用键值对发送的。查看我的更新答案 @MurtazaHussain 我需要你的帮助我有 JSON 字符串,我需要添加选定的 PHOTO 以将其上传。我可以给你发邮件吗?【参考方案3】:

Retrofit 的 multipart 只需要 multipart 和 requestbody。

Call<SubmitLevel1Part2IconResp> loadLevel1halfIconswithImage(@Part("headerdata[relation][icon_type]") RequestBody icon_type, @Part("headerdata[relation][name]") RequestBody name, @Part MultipartBody.Part file);

然后在java中

 // MultipartBody.Part is used to send also the actual filename
 MultipartBody.Part body =  MultipartBody.Part.createFormData("headerdata[relation][relative_image]", fileUpload.getName(), requestFile);



call = service.loadLevel1halfIconswithImage(icon_type, name, body);

【讨论】:

以上是关于使用 Retrofit 上传 JSON 格式的多部分图像数据?的主要内容,如果未能解决你的问题,请参考以下文章

Retrofit初探——POST方式提交JSON数据

使用 JSend 格式通过 Retrofit 将 JSON 响应转换为 POJO?

当列表的各个项目使用Retrofit和Gson的格式不同时,如何解析json列表?

如何使用 Retrofit 查询某些 JSON 项目?

带有 JSON 参数的多部分数据 Alamofire

Android Retrofit 请求字符串(非JSON数据)