引入okhttp库
implementation ("com.squareup.okhttp3:okhttp:4.9.0")
代码
class UploadImgActivity : AppCompatActivity() {
lateinit var binding:ActivityUploadImgBinding
companion object{
const val FROM_ALBUM = 1
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUploadImgBinding.inflate(layoutInflater)
setContentView(binding.root)
initView()
}
private fun initView() {
binding.btUploadImg.setOnClickListener {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "image/*"
startActivityForResult(intent, FROM_ALBUM)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
FROM_ALBUM -> {
if (resultCode == Activity.RESULT_OK && data != null) {
val selectedPhotoUri = data.data
selectedPhotoUri?.let {
uploadImg(it)
}
}
}
}
}
//使用okhttp上传图片
private fun uploadImg(uri: Uri) = try{
val okhttpClient = OkHttpClient()
val builder = MultipartBody.Builder()
.setType(MultipartBody.FORM)
val file = uri.toFile(this)
file?.let{
builder.addFormDataPart(
"file",
it.name,
it.asRequestBody("multipart/form-data;charset=utf-8".toMediaTypeOrNull())
)
}
val body = builder.build()
val request = Request.Builder().url("http://www.httpbin.org/post").post(body).build()
okhttpClient.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
}
override fun onResponse(call: Call, response: Response) {
println("responseBody${response.body?.string()}")
}
})
}catch (e: Exception){
}
}
xml文件
布局文件只有一个button,就不写了。
Uri.toFile方法
fun Uri.toFile(context: Context): File? = when (scheme) {
ContentResolver.SCHEME_FILE -> toFile()
ContentResolver.SCHEME_CONTENT -> {
val columns = arrayOf(MediaStore.Images.ImageColumns.DISPLAY_NAME)
val cursor = context.contentResolver.query(this, columns, null, null, null)
val file = cursor?.use {
if (it.moveToFirst()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val ois = context.contentResolver.openInputStream(this)
val displayName = it.getString(it.getColumnIndex(MediaStore.Images.ImageColumns.DISPLAY_NAME))
ois?.use { ois ->
val file = File(
context.externalCacheDir,
"new$displayName"
)
if(file.exists()){
file.delete()
}
file.createNewFile()
val fos = FileOutputStream(file)
ois.copyTo(fos)
fos.close()
file
}
} else
File(it.getString(it.getColumnIndex(MediaStore.Images.Media.DATA)))
} else null
}
file
}
else -> null
}