欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android中Okhttp3实现上传多张图片同时传递参数

程序员文章站 2023-12-04 22:38:22
之前上传图片都是直接将图片转化为io流传给服务器,没有用框架传图片。 最近做项目,打算换个方法上传图片。 android发展到现在,okhttp显得越来越重要,...

之前上传图片都是直接将图片转化为io流传给服务器,没有用框架传图片。

最近做项目,打算换个方法上传图片。

android发展到现在,okhttp显得越来越重要,所以,这次我选择用okhttp上传图片。

okhttp目前已经更新到okhttp3版本了,用法跟之前相比,也有一些差别。在网上找了很多资料,

并和java后台同事反复调试,终于成功上传多张图片,同时传递一些键值对参数。

以下是我对该过程的封装:

private static final mediatype media_type_png = mediatype.parse("image/png");

/**
   * 上传多张图片及参数
   * @param requrl url地址
   * @param params 参数
   * @param pic_key 上传图片的关键字
   * @param paths 图片路径
   */
  public observable<string> sendmultipart(string requrl,map<string, string> params,string pic_key, list<file> files){
    return observable.create(new observable.onsubscribe<string>(){

      @override
      public void call(subscriber<? super string> subscriber) {
        multipartbody.builder multipartbodybuilder = new multipartbody.builder();
        multipartbodybuilder.settype(multipartbody.form);
        //遍历map中所有参数到builder
        if (params != null){
          for (string key : params.keyset()) {
            multipartbodybuilder.addformdatapart(key, params.get(key));
          }
        }
        //遍历paths中所有图片绝对路径到builder,并约定key如“upload”作为后台接受多张图片的key
        if (files != null){
          for (file file : files) {
            multipartbodybuilder.addformdatapart(pic_key, file.getname(), requestbody.create(media_type_png, file));
          }
        }
        //构建请求体
        requestbody requestbody = multipartbodybuilder.build();

        request.builder requestbuilder = new request.builder();
        requestbuilder.url(requrl);// 添加url地址
        requestbuilder.post(requestbody);
        request request = requestbuilder.build();
        mokhttpclient.newcall(request).enqueue(new callback() {
          @override
          public void onfailure(call call, ioexception e) {
            subscriber.onerror(e);
            subscriber.oncompleted();
            call.cancel();
          }

          @override
          public void onresponse(call call, response response) throws ioexception {
            string str = response.body().string();
            subscriber.onnext(str);
            subscriber.oncompleted();
            call.cancel();
          }
        });
      }
    });
  } 

在ui界面的调用:

okhttp3utils.getinstance().sendmultipart(constants.url.url_add_notice, mmap, "appendix", mimagelist)
        .observeon(androidschedulers.mainthread())
        .subscribeon(schedulers.newthread())
        .subscribe(new subscriber<string>() {
          @override
          public void oncompleted() {

          }

          @override
          public void onerror(throwable throwable) {
            logutil.i(tag, "throwable:" + throwable.tostring());
          }

          @override
          public void onnext(string s) {
            
            logutil.i(tag, "s:" + s);
          }
        }); 

调试过程中,有一次将 multipartbodybuilder.addformdatapart(pic_key, file.getname(), requestbody.create(media_type_png, file));写成了 multipartbodybuilder.addformdatapart(pic_key, null, requestbody.create(media_type_png, file));导致后台无法用常规方法获取图片(虽然断点调试时也能看到图片数据),这点需要注意。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。