一、背景
一般上传文件都是以表单形式上传文件,最近项目中涉及到非表单形式上传文件流,分为单个文件流上传、大文件分段上传,此种情景资料较少,这里记录下。
二、方案介绍
2.1 需求协议
1. 上传文件
api 端点:/service/upload
● 方法:put
● 请求参数:
○ filename:文件名(必选)
○ 请求头:
○ authorization:用于身份验证的 token(必选)
○ x-request-id:请求的唯一标识符(必选)
○ upload-offset:当前上传块的偏移量(必选)
■ 单位:byte
○ upload-type:文件上传方式(必选)
■ 1 上传到相册(/storage/emulated/0/pictures/)
■ 2 上传到sdcard(/sdcard/)
○ 请求体
○ 文件二进制数据2.2 定义接口
格式:http://example.com/api/upload?filename=example.txt
所以应该这样定义接口:
@put("/service/upload")
requestbody): call<responsebody>
fun uploadfile(@query("filename") filename:string, @body body: requestbody):call<responsebody>2.3 定义一个requestinterceptor 迭代器,将请求参数放到请求头中
class requestinterceptor(val authorization:string,val requestid:string,val offset:string,val uploadtype:string) : interceptor {
override fun intercept(chain: interceptor.chain): response {
val request = chain.request()
val requestbuilder = request.newbuilder()
requestbuilder.addheader("authorization", authorization)
requestbuilder.addheader("x-request-id", requestid)
if(offset.isnotempty()){
requestbuilder.addheader("upload-offset", offset)
}
if(uploadtype.isnotempty()){
requestbuilder.addheader("upload-type", uploadtype)
}
// requestbuilder.removeheader("content-length")
// requestbuilder.removeheader("content-transfer-encoding")
// requestbuilder.removeheader("content-disposition")
return chain.proceed(requestbuilder.build())
}
}2.4调用接口
// 创建文件名请求体
val requestbody = requestbody.create(null, file)//第一个参数传null
val call = retrofitclient.getuploadfileservice(token, requestid, "0", uploadtype)
.uploadfile(file.name, requestbody)用到的相关库:
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.14.9'
到此这篇关于android 使用retrofit 以纯二进制文件流上传文件的文章就介绍到这了,更多相关android 使用retrofit 上传文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论