场景:
用户填写表单或报告时可能除了文本内容,还需要同时上传多张图片。
Android端代码:
1.接口
@Multipart
@POST("report/saveReport")
Observable<ReportResponse> saveReport(@Part("info") RequestBody info,@PartMap Map<String,RequestBody> map);
此处除了@POST注解外还用到了@Multipart注解,两个参数里第一个@Part(“info”) 用来上传文本信息,第二个@PartMap 用来上传多张图片。
2.代码
Gson gson = new Gson();
RequestBody info = RequestBody.create(MultipartBody.FORM,gson.toJson(ReportBean));
HashMap<String,RequestBody> map =new HashMap<>();
for (File file: Files) {
RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), file);
map.put("pictures\";filename=\""+file.getName,requestFile);
}
ReportBean是要上传的报告的bean信息(文本信息),通过Gson转换成String类型。Files 是一个list,存储的是要上传的图片。
3.上传
saveReport(info,map);
具体的Retrofit上传代码我就不写了
服务端代码:
@RequestMapping(value = "/saveReport", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> saveReport(@RequestParam("info") String info,@RequestParam(value = "pictures", required = false) CommonsMultipartFile[] pictures) {
String reportBean = info;//文本内容
for(CommonsMultipartFile file : pictures){
String imgName = file.getFileItem().getName();
File localFile = new File("K:/"+file.getOriginalFilename());
try {
file.transferTo(localFile);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return this.getSuccess();
}
reportBean 就是客户端上传的文本内容,pictures是接收客户端的多张图片。
有两点需要注意:
1.CommonsMultipartFile[]后面要有“[]”,表示上传的是多张图片,否则后台每次只会接收到一张图片。
2.Android端代码map.put("pictures\";filename=\""+file.getName,requestFile);
map的key必须这样拼接。其中picture必须要与服务端@RequestParam(value = “pictures”, required = false)里的value的值一样,否则会报空指针错误。
客户端还有另外一种写法:
1.接口
@Multipart
@POST("report/saveReport")
Observable<ReportResponse> saveReport(@Part("info") RequestBody info,@Part("pictures") RequestBody picture);
上面两处接口都用了@Part 注解
2.代码
Gson gson = new Gson();
RequestBody.create(MultipartBody.FORM,gson.toJson(ReportBean));
MultipartBody.Builder mBuilder = new MultipartBody.Builder();
for (File file: Files) {
RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), file);
mBuilder.addFormDataPart("pictures", file.getName, requestFile);
}
上传文本地方没变,变的是上传图片的地方。利用MultipartBody.Builder
可以多次addFormDataPart
的特性,依次添加多张图片。这个方法与上面的方法相比,好处在于map
的key值不用自己拼接。
3.上传
saveReport(info,mBuilder.build());
上传的代码不变,与上面一样。