使用Retrofit上传URI文件

The Rhine–Meuse–Scheldt a river delta in the Netherlands

首先定义一个上传方法:

@Headers(DOMAIN_NAME+ DOMAIN_NAME_testServer)
@Multipart //注意这里的multipart和POST类型
@POST("/internal-api/android/file/upload")
suspend fun uploadFile(@Part fileList: List<MultipartBody.Part>): BaseResponse<List<String>>

注意代码中的multipart注解,要上传多个文件的话就是@Part fileList: List<MultipartBody.Part>为入参,单个文件就是@Part file: MultipartBody.Part为入参

准备组成body:

val builder = MultipartBody.Builder().setType(MultipartBody.FORM) //表单类型
// URI列表
picList.forEach {
    //使用context获取文件名,可选
    val documentFile: DocumentFile =
        DocumentFile.fromSingleUri(applicationContext, it)!!

    val resolver = applicationContext.contentResolver
    resolver.openInputStream(it).use { stream ->
        // Perform operations on "stream".
        val b = stream!!.readBytes()
        val requestFile: RequestBody = b.toRequestBody("image/*".toMediaTypeOrNull(), 0, b.size)
        //"fileList"即为要传输的字段名
        builder.addFormDataPart("fileList", documentFile.name, requestFile)
    }
}

//如果传输多个文件,则直接传入
val parts = builder.build().parts
uploadFile(fileList = parts)

//如果传输单个文件,可以这样
val parts = builder.build().part(0)
uploadFile(fileList = parts)