Android使用Retrofit上传文件功能

作者:最萌小熊猫 时间:2022-08-28 08:42:38 

本文实例为大家分享了Android使用Retrofit上传文件的具体代码,供大家参考,具体内容如下

一、封装RetrofitManager

public class RetrofitManager {
    private static RetrofitManager retrofitManager;
    
    private Retrofit retrofit;

    private RetrofitManager() {}

    public static RetrofitManager getInstance() {
        if (retrofitManager == null) {
            synchronized (RetrofitManager.class) {
                if (retrofitManager == null) {
                    retrofitManager = new RetrofitManager();
                }
            }
        }
        return retrofitManager;
    }

    public Retrofit getRetrofit() {
        if (retrofit == null) {
            // 添加日志 *
            HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
            // 拦截等级为body(可以打印出完整的网络请求)
            httpLoggingInterceptor.level(HttpLoggingInterceptor.Level.BODY);
            // 使用OkHttpClient
            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .addInterceptor(httpLoggingInterceptor)
                    .connectTimeout(1, TimeUnit.MINUTES)
                    .readTimeout(1,TimeUnit.MINUTES)
                    .build();

            // 创建出Retrofit
            retrofit = new Retrofit.Builder()
                     // 使用Gson转换工厂
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    // 基础Url
                    .baseUrl("http://**.**.**.**:**/")
                    .client(okHttpClient)
                    .build();
        }
        return retrofit;
    }
}

二、上传单一文件

1.在Api接口中声明方法

@Multipart
@POST("fileUpload")
Observable<String> upload(@Part List<MultipartBody.Part> parts);

2.实例化api接口

// 实例化api接口
Api api = RetrofitManager.getInstance().getRetrofit().create(Api.class);

3.构建参数

File file = new File("/sdcard/DCIM/Camera/**.jpg");
RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"), file);

MultipartBody multipartBody = new MultipartBody.Builder()
                .addFormDataPart("file", "fileName.jpg", body)
                .setType(MultipartBody.FORM)
                .build();

4.提交请求

api.upload(parts)
   .observeOn(AndroidSchedulers.mainThread())
   .subscribeOn(Schedulers.io())
   .subscribe(new Observer<String>() {
       @Override
       public void onNext(String s) {
           Log.i("--",s); // 请求结果
       }
       @Override
       public void onError(Throwable e) {

       }
       @Override
       public void onComplete() {

       }
   });

三、上传多个文件

1.在Api接口中声明方法

@Multipart
@POST("fileUploadMore")
Observable<String> uploadMore(@PartMap Map<String, List<MultipartBody.Part>> multiMap);

2.实例化api接口

// 实例化api接口
Api api = RetrofitManager.getInstance().getRetrofit().create(Api.class);

3.构建参数

File file = new File("/sdcard/DCIM/Camera/**.jpg");
RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"), file);

MultipartBody multipartBody1 = new MultipartBody.Builder()
                .addFormDataPart("file", "fileName1.jpg", body)
                .setType(MultipartBody.FORM)
                .build();
MultipartBody multipartBody2 = new MultipartBody.Builder()
                .addFormDataPart("file", "fileName2.jpg", body)
                .setType(MultipartBody.FORM)
                .build();
MultipartBody multipartBody3 = new MultipartBody.Builder()
                .addFormDataPart("file", "fileName3.jpg", body)
                .setType(MultipartBody.FORM)
                .build();
MultipartBody multipartBody4 = new MultipartBody.Builder()
                .addFormDataPart("file", "fileName4.jpg", body)
                .setType(MultipartBody.FORM)
                .build();

// 把所有文件放入map集合中
Map<String, List<MultipartBody.Part>> parts = new HashMap<>();
parts.put("f1",multipartBody1.parts());
parts.put("f2",multipartBody2.parts());
parts.put("f3",multipartBody3.parts());
parts.put("f4",multipartBody4.parts());

4.提交请求

api.uploadMore(parts)
   .observeOn(AndroidSchedulers.mainThread())
   .subscribeOn(Schedulers.io())
   .subscribe(new Observer<String>() {
       @Override
       public void onNext(String s) {
           Log.i("--",s); // 请求结果
       }
       @Override
       public void onError(Throwable e) {

       }
       @Override
       public void onComplete() {

       }
   });

来源:https://blog.csdn.net/weixin_42600398/article/details/121554736

标签:Android,Retrofit,上传文件
0
投稿

猜你喜欢

  • 简单了解Spring中常用工具类

    2021-09-24 10:44:28
  • MyBatis全局配置文件详解

    2021-09-19 10:13:32
  • C++ 反汇编之关于Switch语句的优化措施

    2023-09-10 15:00:15
  • 基于C#实现语音识别功能详解

    2023-07-12 18:55:24
  • Java 生产者/消费者问题实例详解

    2023-02-26 01:23:36
  • 理解Java中的内存泄露及解决方法示例

    2023-04-24 23:19:51
  • Unity UI实现拖拽旋转

    2023-04-10 06:44:59
  • Servlet注解之@WebInitParam多个InitParam的使用

    2023-08-04 13:43:01
  • C#线程同步的几种方法总结

    2022-01-31 19:49:06
  • Spring及Mybatis整合占位符解析失败问题解决

    2022-08-13 06:42:49
  • 关于C#理解装箱与拆箱

    2023-06-18 21:07:50
  • logback使用filter过滤日志操作

    2022-07-11 03:20:27
  • 基于Java代码实现支付充值的通用流程

    2021-09-04 00:48:45
  • java异常与错误处理基本知识

    2023-11-25 10:44:59
  • 怎样使用PowerMockito 测试静态方法

    2022-06-18 08:28:59
  • 聊聊Redis二进制数组Bitmap

    2021-07-26 11:51:57
  • java代码实现MD5加密及验证过程详解

    2023-09-26 02:50:45
  • springboot2.x整合tkmapper的示例代码

    2021-09-19 11:56:59
  • Java制作智能拼图游戏原理及代码

    2022-08-02 21:46:57
  • Java基础之关键字final详解

    2022-01-28 00:55:31
  • asp之家 软件编程 m.aspxhome.com