UploadDemo
UploadDemo copied to clipboard
上传文件的时候需要再加别的参数要怎么操作?直接params添加不行
这样就可以传其他参数了
val params = ArrayMap<String, Any>()
params["file"] = file
params["LoadOnSubscribe"] = loadOnSubscribe
params["key"] = value
class FileRequestBodyConverter : Converter<ArrayMap<String, Any>, RequestBody> {
//进度发射器
var uploadOnSubscribe: LoadOnSubscribe? = null
@Throws(IOException::class)
override fun convert(params: ArrayMap<String, Any>): RequestBody {
uploadOnSubscribe = params["LoadOnSubscribe"] as LoadOnSubscribe?
val builder = MultipartBody.Builder().setType(MultipartBody.FORM)
params.forEach {
if (it.key == "LoadOnSubscribe") {
uploadOnSubscribe = it.value as LoadOnSubscribe?
return@forEach
} else if (it.key == "fileList") {
filesToMultipartBody(builder, it.value as List<File>)
return@forEach
} else if (it.key == "file") {
fileToMultipartBody(builder, it.value as File)
return@forEach
} else {
builder.addFormDataPart(it.key, it.value.toString())
}
}
return builder.build()
}
/**
* 用于把 File集合 或者 File路径集合 转化成 MultipartBody
*
* @param <T> 泛型(File 或者 String)
* @param files File列表或者 File 路径列表
* @return MultipartBody(retrofit 多文件文件上传)
</T> */
@Synchronized
fun filesToMultipartBody(builder: MultipartBody.Builder, files: List<File>): MultipartBody.Builder {
var sumLeng = 0L
for (file in files) {
sumLeng += file.length()
// TODO 为了简单起见,没有判断file的类型
val requestBody = FileProgressRequestBody(file, "multipart/form-data", uploadOnSubscribe)
builder.addFormDataPart("file", file.name, requestBody)
}
uploadOnSubscribe!!.setmSumLength(sumLeng)
return builder
}
@Synchronized
fun fileToMultipartBody(builder: MultipartBody.Builder, file: File): MultipartBody.Builder {
var sumLeng = 0L
sumLeng += file.length()
// TODO 为了简单起见,没有判断file的类型
val requestBody = FileProgressRequestBody(file, "multipart/form-data", uploadOnSubscribe)
builder.addFormDataPart("file", file.name, requestBody)
uploadOnSubscribe!!.setmSumLength(sumLeng)
return builder
}
}
看了你贴的代码 没有问题啊 我在项目中也是这样玩儿的,一直ok
你当前的代码缺少大概这一块,导致只处理了LoadOnSubscribe和file相关的key,导致如果想文件和其他数据一起传的话,其他数据传不上去。比如传1个文件加一个name=asd,name=asd是不在请求里的。
else {
builder.addFormDataPart(it.key, it.value.toString())
}