retrofit+observer上传头像+上传图片/多张

首先我们要导入依赖

compile 'io.reactivex.rxjava2:rxjava:2.0.7'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:converter-scalars:2.1.0'

简陋的封装一个请求工具类.

import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

public class HttpRequestClient {
 
  public static final String TAG = "HttpRequestClientTAG";
 
  private static Retrofit retrofit;
 
  private static OkHttpClient getOkHttpClient() {
   /* //日志显示级别
    HttpLoggingInterceptor.Level level= HttpLoggingInterceptor.Level.BODY;
    //新建log拦截器
    HttpLoggingInterceptor loggingInterceptor=new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
      @Override
      public void log(String message) {
        Log.d(TAG, message);
      }
    });
    loggingInterceptor.setLevel(level);*/
    //定制OkHttp
    OkHttpClient.Builder httpClientBuilder = new OkHttpClient
        .Builder();
    //OkHttp进行添加拦截器loggingInterceptor
   // httpClientBuilder.addInterceptor(loggingInterceptor);
    return httpClientBuilder.build();
  }
 
  public static Retrofit getRetrofitHttpClient(){
    if(null == retrofit){
      synchronized (HttpRequestClient.class){
        if(null == retrofit){
          retrofit = new Retrofit.Builder()
              .client(getOkHttpClient())
              .baseUrl("https://www.zhaoapi.cn/")
              .addConverterFactory(GsonConverterFactory.create())
              .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
              .build();
        }
      }
    }
    return retrofit;
  }
} 定义一个接口来设置请求的参数和准备上传的文件
public interface GoodsReturnApiService {
//上传文件必须用这个注解
  @Multipart
  @POST("file/upload")
    //这里是自己post文件的地址@part就是你准备上传的文件,写自己的bean
  Observable<LoadBean> postGoodsReturnPostEntitys(@PartMap Map<String, RequestBody> map, @Part List<MultipartBody.Part> parts);
}


在activity中调用这个方法就可上传头像

private void postGoodsPicToServer(){
    Map<String,RequestBody> params = new HashMap<>();
    //以下参数是,参数需要换成自己服务器支持的
    params.put("uid", convertToRequestBody("1701"));
    params.put("token",convertToRequestBody("E6C4C1B581A506F2F4D6748B3649AD3C"));
    params.put("source",convertToRequestBody("android"));
    params.put("appVersion",convertToRequestBody("101"));

    //要添加的文件,这是一个集合,可以传一个,也可以传多个.
    String path1 = Environment.getExternalStorageDirectory()+"/abc.png";
   // String path2 = Environment.getExternalStorageDirectory() +"/abc.png";
    imageView.setImageURI(Uri.parse(path1));
    List<File> fileList = new ArrayList<>();
    //将你文件的路径添加到集合内部.
    fileList.add(new File(path1));

    List<MultipartBody.Part> partList = filesToMultipartBodyParts(fileList);
    
    HttpRequestClient.getRetrofitHttpClient().create(GoodsReturnApiService.class)
            .postGoodsReturnPostEntitys(params,partList)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<LoadBean>() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {
                    Toast.makeText(MainActivity.this,"onSubscribe",Toast.LENGTH_LONG).show();

                }

                @Override
                public void onNext(@NonNull LoadBean goodsReturnPostEntity) {
                    Toast.makeText(MainActivity.this,"success",Toast.LENGTH_LONG).show();
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    Toast.makeText(MainActivity.this,"onError",Toast.LENGTH_LONG).show();

                }

                @Override
                public void onComplete() {
                    Toast.makeText(MainActivity.this,"onComplete",Toast.LENGTH_LONG).show();

                }
            });
}
private RequestBody convertToRequestBody(String param){
    RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), param);
    return requestBody;
}
private List<MultipartBody.Part> filesToMultipartBodyParts(List<File> files) {
    List<MultipartBody.Part> parts = new ArrayList<>(files.size());
    for (File file : files) {
         //设置文件的类型
        RequestBody requestBody = RequestBody.create(MediaType.parse("image/png"), file);
         //file就是上传文件的参数类型,后面的file.getName()就是你上传的文件,首先要拿到文件的地址
        MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
        parts.add(part);
    }
    return parts;
}

猜你喜欢

转载自blog.csdn.net/shilei_comeon/article/details/79209456