For those with an inputStream, you can upload inputStream using Multipart
.
@Multipart
@POST("pictures")
suspend fun uploadPicture(
@Part part: MultipartBody.Part
): NetworkPicture
Then in perhaps your repository class:
suspend fun upload(inputStream: InputStream) {
val part = MultipartBody.Part.createFormData(
"pic", "myPic", RequestBody.create(
MediaType.parse("image/*"),
inputStream.readBytes()
)
)
uploadPicture(part)
}
To get an input stream you can do something like so.
In your fragment or activity, you need to create an image picker that returns an InputStream
. The advantage of an InputStream is that it can be used for files on the cloud like google drive and dropbox.
Call pickImage()
from a View.OnClickListener
or onOptionsItemSelected
.
private fun pickImage() {
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.type = "image/*"
startActivityForResult(intent, PICK_PHOTO)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == PICK_PHOTO && resultCode == Activity.RESULT_OK) {
try {
data?.let {
val inputStream: InputStream? =
context?.contentResolver?.openInputStream(it.data!!)
inputStream?.let { stream ->
itemViewModel.uploadPicture(stream)
}
}
} catch (e: FileNotFoundException) {
e.printStackTrace()
}
}
}
companion object {
const val PICK_PHOTO = 1
}