-
-
Save cketti/8ac927509787d7085a5ef8f866806f0f to your computer and use it in GitHub Desktop.
import android.content.ContentResolver | |
import android.net.Uri | |
import okhttp3.MediaType | |
import okhttp3.RequestBody | |
import okio.BufferedSink | |
import okio.Okio | |
import java.lang.IllegalStateException | |
class ContentUriRequestBody( | |
private val contentResolver: ContentResolver, | |
private val contentUri: Uri | |
) : RequestBody() { | |
override fun contentType(): MediaType? { | |
val contentType = contentResolver.getType(contentUri) ?: return null | |
return MediaType.parse(contentType) | |
} | |
override fun writeTo(sink: BufferedSink) { | |
val inputStream = contentResolver.openInputStream(contentUri) | |
?: throw IllegalStateException("Couldn't open content URI for reading: $contentUri") | |
Okio.source(inputStream).use { source -> | |
sink.writeAll(source) | |
} | |
} | |
} |
@neiljaywarner: What information would you hope to find in a blog post about this?
I apologise. I didn't mean "why didn't you make a blog about it" as much as "this seems so cool why aren't more people discussing it"
Specifically though.. Basic usage n minimum sample app or at least calling site
I apologise. I didn't mean "why didn't you make a blog about it" as much as "this seems so cool why aren't more people discussing it"
@neiljaywarner: No worries, I didn't read it like that. I was asking because I was in the mood for writing. So I created this blog post and a sample app. I hope it helps.
ah. I didn't notice put vs post. (s3). That doesn't give me the answer yet but it does make me think your stuff is fine :)
I believe the issue is that S3 doesn't support the 'chunked' transfer encoding for uploads. This is what OkHttp will use for large files when the RequestBody
doesn't specify a size. You can help OkHttp out by implementing the contentLength()
method. To get the size of a document you could use DocumentFile.length().
@cketti What if we want to know the file size to get the progress of upload?
awesome thanks! Not sure why this isn't built in somewhere yet, or in a blog post or extension?