Android使用Retrofit上传文件功能
作者:最萌小熊猫 发布时间:2022-08-28 08:42:38
标签:Android,Retrofit,上传文件
本文实例为大家分享了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


猜你喜欢
- 1.固定大小的线程池简介线程池就是在程序启动的时候先建立几个可以使用的线程放在那里,然后等着具体的任务放进去,这个任务基本可以说都是Runn
- 一,块作用域首先在深入学习控制结构之前,需要先了解块(block)的概念。块:即复合语句,是指由一对大括号括起来的若干条简单的 Java 语
- 本文实例讲述了C++判断一个链表是否为回文结构的方法。分享给大家供大家参考,具体如下:题目:给定一个链表头节点head,请判断是否为回文结构
- 本文实例讲述了C#实现跨线程操作控件方法,分享给大家供大家参考。具体实现方法如下:由于在.net平台下Winform、wpf禁止跨线程直接访
- 序言之前封装过一个日志注解,打印方法执行信息,功能较为单一不够灵活,近来兴趣来了,想重构下,使其支持表达式语法,以应对灵活的日志打印需求。该
- C#字符集编码的使用ASCII:西欧字符集GB2312:国家简体中文字符集,兼容ASCII。BIG5:统一繁体字编码GBK:它是GB2312
- 1.强引用( Strong Reference )最普遍的引用:Object obj=new Object()抛出OutOfMemoryEr
- 实例如下:public class ConfigOperator { #region 从配置文件获取V
- 1,什么是字符编码? 字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。一组
- 迅雷下载是目前使用非常普遍的一个下载软件,本文实例展示了C#实现调用迅雷下载的方法。具体方法如下:目前该实例代码只支持HTTP协议,具体功能
- 记得老师讲课的时候,经常会用PPT遥控翻页笔来遥控幻灯片来给我们讲课,当时觉得非常有趣,由于这段时间接触了VSTO相关的开发,了解到了Off
- 这篇文章主要介绍了Spring Boot项目中定制 * 的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 一.关于数组的特点1.在Java中,无论使用数组或集合,都有边界检查。如果越界操作就会得到一个RuntimeException异常。2.数组
- 一个项目可能会有不同的环境,例如dev/stating/prod等,不同的环境的配置文件是不同的,如何根据环境快速的切换到对应的配置文件很重
- Java中多态性的实现什么是多态面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念
- 情况简介spring项目,controller异步调用service的方法,产生大量并发。具体业务:前台同时传入大量待翻译的单词,后台业务接
- 前言此节假日为严格按照国家要求的双休和法定节假日并且包含节假日的补班信息,大家可根据自己的需求自定义处理哦。以下为Maven配置,是程序用到
- 我们经常在项目中使用的线程池,但是是否关心过线程池的关闭呢,可能很多时候直接再项目中直接创建线程池让它一直运行当任务执行结束不在需要了也不去
- 今天把Android Studio 升级到4.1版本,发现GsonFormat没有了,网上有的解决办法从https://plugins.je
- 使用python和java实现数独游戏,有比较才有收获哦。1、Python版#--coding:utf-8--import ra