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

9
我想使用Retrofit在Android中发送一个JSON PUT请求(包含图片)。下面是需要发送的JSON body:
{
    "Request": {
        "data": {
            "Key": "keydata",
            "param": {
                "title": "Testingpostmultipartimageupload",
                "photo": **"IMAGE BYTE DATA"**
            }
        }
    }
}

有什么线索吗?

我在使用 Retrofit 2 时遇到了问题,能告诉我如何在 Retrofit 2 中完成这个操作吗? - Nivedh
我之前使用的是Retrofit 1.6版本。今晚我会检查一下Retrofit 2的情况。 - Patrick
谢谢您,@Patrick。这对我很有帮助。 - Nivedh
3个回答

17

好的,我找到了一种使用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
);

你如何填充对象的其他字段?(例如标题) - Labe
1
你只需要添加 @Part("request[data][param][title]") String title。我会编辑我的答案来设置完整的答案。 - Patrick
谢谢你!除了文件字段之外,其他字段是否也必须是@Part注释? - Labe
是的,这个解决方案需要为每个字段使用@Part。 - Patrick
@Patrick,你能给我指一条路吗?我想尝试在一个请求中发送带有JSON数据的图片。链接:https://dev59.com/aF0b5IYBdhLWcg3wCtXY - JJD
@JJD 看起来你找到了解决方案? - Patrick

0

Retrofit只接受multipart和requestbody作为其multipart的参数。

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);

0

你需要使用多部分表单数据将图像数据以字节形式放入其中。

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 库来实现这个。 - Patrick
除非您的服务器接受JSON字符串并将其解析为对象,否则您无法发送JSON对象。通常使用键值对发送POST请求。请查看我的更新答案。 - Murtaza Khursheed Hussain
@MurtazaHussain,我需要你的帮助。我有一个JSON字符串,我需要添加选定的照片以便上传它。可以给我你的邮件吗? - Chlebta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接