Retrofit2.0 带文本多图片上传及后台spring mvc 文本图片接收

4 篇文章 0 订阅
2 篇文章 0 订阅

场景:

  用户填写表单或报告时可能除了文本内容,还需要同时上传多张图片。
  

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

  上传的代码不变,与上面一样。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值