くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

【小ネタ】取得したファイルをURIをRetrofitで送信する

表題まま。取得したファイルを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()
            }
        }
    }

参考にしたサイト様