android开发:使用retrofit2框架,如何上传图片文件+json参数?

士心山 2017-11-09 05:13:58
功能需求:根据下面的post请求参数,用retrofit2框架接口请求
1)请求地址
http://{domain}/rest/services/file
2)请求方法
POST
3)请求数据
请求体数据 | 是否必填 | 说明
json | 是 | 上传文件参数,包含文件名和文件上传保存的路径
file | 是 | 文件对象
------------------------------
json数据格式如下:
{
"name": "", // 文件名称
"path": "" // 文件上传保存的路径,路径以“/”开始写起,路径最后无需再加“/”。
}
3)响应状态码
Http状态码 说明
201 上传文件成功。
400 上传文件失败或服务端错误。

本人在百度查了许多retrofit2的上传图片的博客,几乎都说下面的写法,
   @Multipart
@POST("upload")
Call<ResponseBody> upload(@Part("description") RequestBody description,
@Part MultipartBody.Part file)


可是这种写法,结果访问失败
@Multipart
@POST("/rest/services/file")
Call<BaseResponse<String>> uploadFileWithRequestBody(@Part("description") RequestBody description,
@Part MultipartBody.Part file);

下面是测试代码:结果访问失败
File file = new File("/storage/emulated/0/Android/data/com.smart.teach/files/Thumbnail/20171108151210.jpg");
String path ="/image/desk/product";
Gson gson = new Gson();
JsonObject jObj = new JsonObject();
jObj.addProperty("name","20171108105505.jpg");
jObj.addProperty("path",path);

JsonArray jsonArray = new JsonArray();
jsonArray.add(jObj);
RequestBody bodyjson = RequestBody.create(ApiHelper.mediaType, gson.toJson(jsonArray));
RequestBody requestFile =
RequestBody.create(MediaType.parse("image/jpg"), file);
MultipartBody.Part body =
MultipartBody.Part.createFormData("file", file.getName(), requestFile);

Call<BaseResponse<String>> baseResponseCall =
ApiHelper.getInstance().getApiService().uploadFileWithRequestBody(bodyjson, body);

baseResponseCall.enqueue(new Callback<BaseResponse<String>>() {
@Override
public void onResponse(Call<BaseResponse<String>> call, Response<BaseResponse<String>> response) {
Log.i(TAG,"上传成功");
}

@Override
public void onFailure(Call<BaseResponse<String>> call, Throwable t) {
Log.e(TAG,"上传失败");
}
});

打印日志:
11-09 17:08:35.230 21336-21378/com.smart.teach D/zcb: OkHttp====Message:--> POST http://192.168.70.92/rest/services/file http/1.1
11-09 17:08:35.230 21336-21378/com.smart.teach D/zcb: OkHttp====Message:Content-Type: multipart/form-data; boundary=f63696bd-6e04-4684-96b9-e94da0022962
11-09 17:08:35.230 21336-21378/com.smart.teach D/zcb: OkHttp====Message:Content-Length: 463
11-09 17:08:35.330 21336-21336/com.smart.teach D/dalvikvm: GC_FOR_ALLOC freed 806K, 11% free 6969K/7820K, paused 20ms, total 20ms
11-09 17:08:35.340 21336-21336/com.smart.teach I/dalvikvm-heap: Grow heap (frag case) to 9.152MB for 2419696-byte allocation
11-09 17:08:35.360 21336-21345/com.smart.teach D/dalvikvm: GC_FOR_ALLOC freed 7K, 9% free 9324K/10184K, paused 16ms, total 16ms
11-09 17:08:35.450 632-645/com.android.nfc D/NfcDispatcher: Set Foreground Dispatch
11-09 17:08:35.460 21336-21336/com.smart.teach E/MainBizImpl: 上传失败[/code]

请问各位前辈,我该使用retrofit2框架,如何上传图片文件+json参数?
...全文
1337 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
士心山 2017-11-09
  • 打赏
  • 举报
回复
本人问题,已经解决,原来是我json数据格式封装错了,和文档格式不一样,把 JsonArray jsonArray = new JsonArray(); jsonArray.add(jObj);去掉,就可以了
moonFY 2017-11-09
  • 打赏
  • 举报
回复
图太大?换个小的或者转换一下

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧