Я уже загрузил файл с модификацией, используя formdata и @Part, но у меня всегда был экземпляр файла, и я мог легко преобразовать его в тело запроса с помощью функции расширения asRequestBody, включенной в класс RequestBody.
Но теперь мне нужно использовать другой подход. В моем приложении у пользователя нет ограничений по типу файла (это может быть изображение, PDF или что-то еще), поэтому, согласно документации , я использую следующий подход:
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "*/*"
}
requireActivity().startActivityForResult(intent, REQUEST_CODE_PICK_ID)
Работает, и после выбора файла я получаю URI содержимого файла в onActivityResult. Я могу запросить контент-провайдера, чтобы получить небольшой объем информации (например, имя файла), и я могу конвертировать uri контента в дескриптор файла или входной поток, используя распознаватель контента. Но у меня нет экземпляра файла, который мне нужно использовать для преобразования файла в RequestBody.
Я могу получить байтовый массив из входного потока и использовать его (в теле запроса есть другая функция расширения), но правильный ли это подход? Если файл большой, может ли он быть плохим с точки зрения производительности?
Я мог бы создать копию файла, используя inputtream, но мне не нравится этот подход, официальная документация говорит, что вместо него следует использовать open_document get_content как действие намерения избежать создания копии файла.
Итак, как я могу использовать файловый дескриптор или входной поток с модификацией? Есть способ получить экземпляр File из содержимого uri?