使用 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 格式的多部分图像数据?的主要内容,如果未能解决你的问题,请参考以下文章
使用 JSend 格式通过 Retrofit 将 JSON 响应转换为 POJO?