Retrofit使用协程发送请求参考文章 :https://www.cnblogs.com/sw-code/p/14451921.html

导入依赖

app的build文件中加入:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
  • 注意依赖版本

Retrofit实例

/**
* 创建Retrofit提供API Service
*/
object RetrofitClient { const val BASE_URL = "http://192.168.2.194:8080/" // http://localhost:8080/ val okHttpClient = OkHttpClient.Builder()
.callTimeout(30, TimeUnit.SECONDS)
.build() val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build() val articleService = retrofit.create(ArticleService::class.java) }

Service

interface ArticleService {
@Multipart
@POST("article/upload/picture")
suspend fun uploadSingle(@Part file: MultipartBody.Part): ResultData<Picture> @Multipart
@POST("article/upload/pictures")
suspend fun uploadMulti(@Part files: List<MultipartBody.Part>): ResultData<Picture>
}
  • 注意,请求路径前不加/,因为BASE_URL中已经加了

在ViewModel中使用

class ArticleViewModel : ViewModel() {

    val picture by lazy {
MutableLiveData<Picture>()
} /**
* 上传单张图片
*/
fun uploadSinglePicture(file: File) {
val builder = MultipartBody.Builder().setType(MultipartBody.FORM) //表单类型
val requestFile: RequestBody = RequestBody.create(MediaType.parse("image/*"), file)
builder.addFormDataPart("file", file.name, requestFile)
val part = builder.build().part(0)
viewModelScope.launch {
val resultData = RetrofitClient.articleService.uploadSingle(part)
picture.value = resultData.data
}
} /**
* 上传多张图片
*/
fun uploadSinglePicture(files: List<File>) {
val builder = MultipartBody.Builder().setType(MultipartBody.FORM) //表单类型
for (file in files) {
val requestFile: RequestBody = RequestBody.create(MediaType.parse("image/*"), file)
builder.addFormDataPart("file", file.name, requestFile)
}
val parts = builder.build().parts()
viewModelScope.launch {
val resultData = RetrofitClient.articleService.uploadMulti(parts)
picture.value = resultData.data
}
}
}

SpringBoot项目接收

/**
* 接收单张图片
*/
@PostMapping("upload/picture")
public Map<String, Object> uploadPicture(@RequestParam("file") MultipartFile file) {
System.out.println(file.getOriginalFilename());
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("url", "http://localhost:8080/picture/" + file.getOriginalFilename());
return dataMap;
}

额外参数

这个直接添加就行了.................

使用Retrofit上传图片的更多相关文章

  1. Retrofit 2.1 入门

    Retrofit 2.1入门 , map);    try {        Response<String>body=call.execute();        System.out. ...

  2. Retrofit 2.0 超能实践(三),轻松实现文件/多图片上传/Json字符串

    文:http://blog.csdn.net/sk719887916/article/details/51755427 Tamic 简书&csdn同步 通过前两篇姿势的入门 Retrofit ...

  3. Retrofit实现图文上传至服务器

    Retrofit实现图文上传至服务器 前言:现在大多数的项目中都涉及图片+文字上传了,下面请详见实现原理: 开发环境:AndroidStudio 1.引入依赖: compile 'com.square ...

  4. Retrofit 2.0 轻松实现多文件/图片上传/Json字符串/表单

    如果嫌麻烦直接可以用我封装好的库:Novate: https://github.com/Tamicer/Novate 通过对Retrofit2.0的前两篇的基础入门和案例实践,掌握了怎么样使用Retr ...

  5. 博客使用BOS上传图片

    1.博客平台的选定 从大学开始做个人主页算起,最开始是使用html,CSSS写简单的页面,后面大学毕业之后接触到了WordPress,就开始用WordPress搭建网站.现在还维护着一个农村网站.ht ...

  6. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  7. nodejs利用ajax实现网页无刷新上传图片

    nodejs利用ajax实现网页无刷新上传图片 标签(空格分隔): nodejs 通常情况下上传图片是要通过提交form表单来实现的,但是这又不可避免的产生了网页转. 利用ajax技术和FormDat ...

  8. Android Retrofit 2.0 使用-补充篇

    推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ...

  9. Android MVP+Retrofit+RxJava实践小结

    关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...

随机推荐

  1. 创建用户(adduser和useradd)和删除用户(userdel)

    创建用户(adduser和useradd)和删除用户(userdel)及   一  用户创建命令: # adduser  用户名 # useradd  用户名 1) useradd 与 adduser ...

  2. (全解析)屏幕尺寸,分辨率,像素,PPI之间到底什么关系?

    (全解析)屏幕尺寸,分辨率,像素,PPI之间到底什么关系? 产品经理马忠信关注 22015.08.30 13:59:20字数 2,660阅读 52,661 今天我给大家来讲讲这几个咱们经常打交道的词到 ...

  3. jmeter中beanshell postprocessor结合fastjson库提取不确定个数的json参数

    在项目实践中,遇到了这样一个问题.用jmeter作http接口测试,需要的接口参数个数是不确定的.也就是说,在每次测试中,根据情况不同,可能页面中的列表中所含的参数个数是不确定的,那么要提取的参数个数 ...

  4. Go语言协程并发---互斥锁sync.Mutex

    package main import ( "fmt" "sync" "time" ) /* mt.Lock() 抢锁 一次只能被一个协程锁 ...

  5. Volatile 原理及使用,java并发中的可见性问题

    1.解决并发编程中的可见性问题 volatile 代表不使用cpu缓存,修改后的数据,将直接刷到内存中,被volatile修饰的变量,读取的时候,也是从内存中读取,不从cpu缓存中读取 上代码 // ...

  6. JNDI注入和JNDI注入Bypass

    之前分析了fastjson,jackson,都依赖于JDNI注入,即LDAP/RMI等伪协议 JNDI RMI基础和fastjson低版本的分析:https://www.cnblogs.com/pia ...

  7. MindSpore API编程概述

    MindSpore API编程概述 总体架构 MindSpore是一个全场景深度学习框架,旨在实现易开发.高效执行.全场景覆盖三大目标,其中易开发表现为API友好.调试难度低,高效执行包括计算效率.数 ...

  8. Centos8配置Nginx开机自启动

    第一步:创建service文件,并编辑(可理解为开机时自动启动Nginx的脚本服务文件) vim /lib/systemd/system/nginx.service /lib 与 /usr/lib 里 ...

  9. awr快照保留时间修改

    ==============  awr快照保留时间修改 ============= 1.查询当前awr报告保留时间 col SNAP_INTERVAL for a20col RETENTION for ...

  10. Kettle通过Http post请求webservice接口以及结果解析处理

    kettle中有两种方式请求webservice服务,一个是Web服务查询,但是这个有缺陷,无法处理复杂的需求,遇到这种情况就需要用Http post来处理了. 网上也有很多关于Http post请求 ...