Multipart RequestBody для выбранной или сделанной фотографии (дескриптор файла, URI)

Я должен отправить файл изображения (кстати, это может быть видео), подобранное или снятое на телефон. Проблемы следующие: - Версия Android может быть предварительно установлена ​​- Retrofit принимает RequestBody, который создается с помощью файла или массива байтов, когда у меня может быть только FileDescriptor.

Глядя на другие посты, похоже, что получение актива с телефона - это настоящая хрень в ***, я понимаю, что вопрос широкий! ....и в этом проблема


person gropapa    schedule 06.02.2016    source источник
comment
Мой ответ на stackoverflow.com/a/67252049/3736955   -  person Jemshit Iskenderov    schedule 25.04.2021


Ответы (1)


Я пришел со следующим: - для изображения это inputStream, основанный на FileDescriptor, например

FileInputStream fileInputStream = new FileInputStream(fileDescriptor);

затем я читаю inputStream, чтобы получить byteArray

ByteArrayOutputStream out = new ByteArrayOutputStream();
    byte[] result = null;
    try {
        byte[] input = new byte[fis.available()];
        int read;
        while ((read = fis.read(input)) != -1) {
            out.write(input, 0, read);
        }
        result = out.toByteArray();
        fis.close();
        out.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;

после того, как я создаю Requestbody, как обычно, я передаю его для модификации с помощью специального метода post multipart, используя специальное значение части, как

... , @Nullable @Part("picture\"; filename=\"picture\" ") RequestBody picture ...

Это было действительно трудно найти, но, поскольку модернизация все еще находится в стадии бета-тестирования, она многое меняет и не имеет документации, надеюсь, это поможет.

person gropapa    schedule 16.02.2016
comment
Что делать, если файл большой? Этот метод загружает все в память (ОЗУ), поэтому он выдаст OutOfMemoryException, как только файл превысит ограничения памяти ~ 100 МБ. - person Ioane Sharvadze; 19.09.2018
comment
Привет и извините за мой очень (очень) поздний ответ, я считаю, что единственный ответ на этот вопрос - реализовать многокомпонентную загрузку, делая то же самое, но в несколько шагов. - person gropapa; 14.01.2019