使用Retrofit上传图片
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上传图片的更多相关文章
- Retrofit   2.1  入门
		Retrofit 2.1入门 , map); try { Response<String>body=call.execute(); System.out. ... 
- Retrofit 2.0 超能实践(三),轻松实现文件/多图片上传/Json字符串
		文:http://blog.csdn.net/sk719887916/article/details/51755427 Tamic 简书&csdn同步 通过前两篇姿势的入门 Retrofit ... 
- Retrofit实现图文上传至服务器
		Retrofit实现图文上传至服务器 前言:现在大多数的项目中都涉及图片+文字上传了,下面请详见实现原理: 开发环境:AndroidStudio 1.引入依赖: compile 'com.square ... 
- Retrofit 2.0 轻松实现多文件/图片上传/Json字符串/表单
		如果嫌麻烦直接可以用我封装好的库:Novate: https://github.com/Tamicer/Novate 通过对Retrofit2.0的前两篇的基础入门和案例实践,掌握了怎么样使用Retr ... 
- 博客使用BOS上传图片
		1.博客平台的选定 从大学开始做个人主页算起,最开始是使用html,CSSS写简单的页面,后面大学毕业之后接触到了WordPress,就开始用WordPress搭建网站.现在还维护着一个农村网站.ht ... 
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
		一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ... 
- nodejs利用ajax实现网页无刷新上传图片
		nodejs利用ajax实现网页无刷新上传图片 标签(空格分隔): nodejs 通常情况下上传图片是要通过提交form表单来实现的,但是这又不可避免的产生了网页转. 利用ajax技术和FormDat ... 
- Android Retrofit 2.0 使用-补充篇
		推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ... 
- Android MVP+Retrofit+RxJava实践小结
		关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ... 
随机推荐
- WPS-插入-公式-菜单 怎样在EXCEL中使用PRODUCT函数
			怎样在EXCEL中使用PRODUCT函数 ################ WPS2018 -插入-公式-[专门有公式菜单] 插入函数 ################## ... 
- mysql基础之数据库备份和恢复实操
			一.基于二进制文件的恢复*** 1.算好要恢复数据的时间段,重定向输入到bin.sql文件中 [root@ren7 mysql]# mysqlbinlog --start-datetime=" ... 
- Day029 JDK8中新日期和时间API (二)
			# JDK8中新日期和时间API (二) Instant介绍 Instant:时间线上的一个瞬时点. 这可能被用来记录应用程序中的事件时间 戳. 在处理时间和日期的时候,我们通常会想到年,月,日,时, ... 
- 『言善信』Fiddler工具 — 2、HTTP请求内容详解
			目录 1.HTTP协议介绍 2.使用Fiddler抓取一个请求 3.НТТP请求报文 (1)НТТP请求报文说明 (2)请求行 (3)请求头(Request Header) (4)请求体 4.НТТР ... 
- 微信小程序从开发到上线流程
			一.微信小程序从开发到上线流程 注册小程序 1.登录微信公众平台 https://mp.weixin.qq.com 2.在微信公众平台>立即注册>小程序中注册微信小程序 3.在邮箱中激活并 ... 
- 对SpringBoot和SpringCloud的理解
			1.SpringCloud是什么 SpringCloud基于SpringBoot提供了一整套微服务的解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于Net ... 
- 深入理解java虚拟机笔记Chapter11
			运行期优化 即时编译 什么是即时编译? 当虚拟机发现某个方法或某段代码运行的特别频繁时,会把这段代码认为成热点代码: 在运行时,虚拟机会将这段代码编译成平台相关的机器码,并进行各种层次的优化. Hot ... 
- 『言善信』Fiddler工具 — 11、Fiddler中Composer功能详解
			目录 1.Composer功能介绍 2.Composer界面说明 3.使用方式 (1)自定义Request请求 (2)Composer重复发送请求 (3)Composer篡改请求数据 1.Compos ... 
- yum的配置
			1. 创建两台虚拟机[root@room9pc01 ~]# clone-vm7Enter VM number: 8 [root@room9pc01 ~]# clone-vm7Enter VM numb ... 
- 【逆向实战】恶意勒索软件分析_披着羊皮的狼_被注入恶意代码的apk
			/文章作者:Kali_MG1937 QQ:3496925334 CNBLOG博客号:ALDYS4/ 今天逛某论坛的时候发现了一篇求助贴 有意思,好久没分析过恶意软件了 今天就拿它来练练手 反编译工具 ... 
