表題まま。取得したファイルをURIをRetrofitで送信したときの備忘録。
そのままだとうまくいかないので、RetrofitをRequestBody
を継承して、
writeTo()時にファイル読み込むようにするといいっぽい
private fun createRequestBody(uri: Uri, context: Context): RequestBody { val contentResolver = context.contentResolver val contentType = MediaType.parse(contentResolver.getType(uri)) val projection = arrayOf(MediaStore.MediaColumns.SIZE) var fileName: String? = null val length = contentResolver .query(uri, projection, null, null, null) ?.use { if (it.moveToFirst()) { // URIから拡張子を取得 val ext = MimeTypeMap.getSingleton().getExtensionFromMimeType(context.contentResolver.getType(uri)) // ファイル名を取得 fileName = "${it.getString(0)}.$ext" it.getLong(0) } else null } ?: throw IllegalArgumentException("uriからファイルサイズを取得できません") return object : RequestBody() { override fun contentLength(): Long = length override fun contentType(): MediaType? = contentType override fun writeTo(sink: BufferedSink) { Okio.source(context.contentResolver.openInputStream(uri)).use { sink.writeAll(it) } } override fun toString(): String { return fileName ?: super.toString() } } }