Select 图片并上传到服务器 android

Select image and upload to server android

我想通过从图库中选择将图片上传到服务器

通过

打开画廊
val pickPhoto = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        startForResult.launch(pickPhoto)

然后activity结果

val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult())
{ result: ActivityResult ->
    if (result.resultCode == Activity.RESULT_OK) {
        //  you will get result here in result.data
        if(result.data!=null){
            val f=File(result.data.toString())
            println(f.absolutePath)
        }
    }

}

但是我认为文件不正确。

我的api电话就像

@Multipart
@PUT
fun uploadFile(
    @Url url:String,
    @Part("file") name: RequestBody,
    @Part filepart: MultipartBody.Part
): Response<String>

我称其为

val fileToUpload: MultipartBody.Part =
            MultipartBody.Part.createFormData("file", file.getName())
        val filename: RequestBody =
            file.getName().toRequestBody("text/plain".toMediaTypeOrNull())
        Api.uploadFile(uploadUrl,filename,fileToUpload) 

这是一个流上传

问题仅由 URI 引起,因为它没有获得正确的文件绝对路径

获取绝对路径

private fun getRealPathFromURI(contentURI: Uri): String {
    val result: String
    val cursor: Cursor? = requireContext().contentResolver.query(contentURI, null, null, null, null)
    if (cursor == null) {
        result = contentURI.getPath().toString()
    } else {
        cursor.moveToFirst()
        val idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA)
        result = cursor.getString(idx)
        cursor.close()
    }
    return result
}

activity 结果

val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult())
{ result: ActivityResult ->
    if (result.resultCode == Activity.RESULT_OK) {
        //  you will get result here in result.data
        if(result.data!=null){
            val f=File(getRealPathFromURI(result.data?.data!!))
            viewModel.uploadCheque(f)
        }
    }

}