object Complete : UploadState()
/**
- 上传中
*/
class Progress(var totalNum: Long, var current: Long) : UploadState()
/**
- 失败
*/
class Error(val e: Exception) : UploadState()
}
MediaType介绍
相信大多数人在写文件上传下载代码的时候,都不太明白MediaType
的含义。这里详细列出MediaType
含义。以及对应解释说明。
| 类型 | 描述 |
| — | — |
| text/html | HTML格式 |
| text/plain | 纯文本格式,空格转换为 “+” 加号,不对特殊字符编码 |
| text/xml | XML格式 |
| text/x-markdown | Markdown格式 |
| image/gif | gif图片格式 |
| image/jpeg | jpg图片格式 |
| image/png | png图片格式 |
| application/xhtml+xml | XHTML格式 |
| application/xml | XML数据格式 |
| application/json | 用来告诉服务端,消息主体是序列化后的JSON字符串 |
| application/pdf | pdf格式 |
| application/msword | Word文档格式 |
| application/octet-stream | 二进制流数据 |
| application/x-www-form-urlencoded | 参数为键值对形式,在发送前编码所有字符(默认)。如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据 |
| multipart/form-data | 不对字符编码,发送大量二进制数据或包含non-ASCII字符的文本,application/x-www-form-urlencoded是效率低下的(需要用更多字符表示一个non-ASCII字符)。需要设定“ <form enctype=‘multipart/form-data’ |
MediaType对象解析
text/html; charset=utf-8
//解析
type值是text,表示是文本这一大类;
后面的html是子类型,表示是文本这一大类下的html类型;
charset=utf-8 则表示采用UTF-8编码
上面介绍完了,下面正式代码封装就开始了。坐稳了,发车!
inline fun simpleUploadFile(
url: String,
filePath: String,
contentType: MediaType? = null,
crossinline block: (UploadState) -> Unit
) {
var state: UploadState = UploadState.UnStart
block(state)
val file = File(filePath)
if (!file.exists()) {
//文件不存在则不上传
state = UploadState.FileNotExist
block(state)
return
}
val request = Request.Builder()
.url(url)
.post(file.asRequestBody(contentType))
.build()
val client = OkHttpClient.Builder()
.dispatcher(dispatcher)
.writeTimeout(30, TimeUnit.MINUTES)
.readTimeout(30, TimeUnit.MINUTES)
.connectTimeout(70, TimeUnit.SECONDS)
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
log(e.message)
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
state = UploadState.Complete
block(state)
} else {
log(“请求失败”)
}
}
})
}
inline fun multipartUpload(
url: String,
filePath: String,
contentType: MediaType? = null,
params: Map<String, String>? = null,
crossinline block: (UploadState) -> Unit
) {
var state: UploadState = UploadState.UnStart
block(state)
val file = File(filePath)
val body = MultipartBody.Builder()
.also {
params?.forEach { (k, v) ->
it.addFormDataPart(k, v)
}
}.also {
if (file.exists()) {
it.addFormDataPart(“filename”, file.name, file.asRequestBody(contentType))
}
}.build()
val request = Request.Builder()
.url(url)
.post(body)
// .addHeader() 可以增加请求头
.build()
val client = OkHttpClient.Builder()
.dispatcher(dispatcher)
.writeTimeout(30, TimeUnit.MINUTES)
.readTimeout(30, TimeUnit.MINUTES)
.connectTimeout(70, TimeUnit.SECONDS)
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
log(e.message)
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
state = UploadState.Complete
block(state)
} else {
log(“请求失败”)
}
}
})
}
fun multipartUploadProgress(
url: String,
filePath: String,
contentType: MediaType? = null,
params: Map<String, String>? = null,
block: (UploadState) -> Unit
) {
var state: UploadState = UploadState.UnStart
block(state)
val file = File(filePath)
val body = MultipartBody.Builder()
.also {
params?.forEach { (k, v) ->
it.addFormDataPart(k, v)
}
}.also {
if (file.exists()) {
it.addFormDataPart(“filename”, file.name, file.asProgressRequestBody(contentType, block))
}
}.build()
val request = Request.Builder()
.url(url)
.post(body)
// .addHeader() 可以增加请求头
.build()
val client = OkHttpClient.Builder()
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!
为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!
Android架构师之路很漫长,一起共勉吧!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
4)]
最后
现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!
为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!
Android架构师之路很漫长,一起共勉吧!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Nk7BGcKz-1712803802234)]