Codename One - Как получить ответ после загрузки файла с составным запросом

Я использую Codename One для загрузки видео в Vimeo с использованием соответствующих API. Я использую составной запрос для фактической загрузки файла, но для определения статуса загрузки требуется ответ. Как я могу получить ответ?

public void doFileUpload(String url, String filename) throws IOException {
    MultipartRequest req = new MultipartRequest() {
        int chr;
        StringBuffer sb = new StringBuffer();
        public String response = "";

        public void readResponse(InputStream input) throws IOException {
            response = Util.readToString(input);

            Log.p("File Response->" + response);
        }

        protected void handleErrorResponseCode(int code, String message)
        {
            Log.p("Error Response->" + message);
        }

        protected void readHeaders(Object connection) throws IOException {
            String val = getHeader(connection, "MyHeaderName");
            Log.p("Header Response->" + val);

        }

        protected void handleException(Exception err) {
            Dialog.show(
                    "Connection Err!!",
                    "Are you connected to the internet? Check your connection",
                    "Ok", null);
        }
    };
    req.setUrl(url);
    req.setPost(true);

    String mime = "application/mp4";
    req.addData("file_data", filename, mime);
    req.setFilename("file_data", filename);
    req.setReadResponseForErrors(true);
    req.addResponseCodeListener(new ActionListener() {

        public void actionPerformed(ActionEvent ev) {
            try {
                NetworkEvent event = (NetworkEvent) ev;
                Log.p("Err Rsp Code->" + event.getResponseCode());
                Log.p("ResponseCodeListener:");
                Log.p(ev.toString() );

person Christian    schedule 24.05.2014    source источник


Ответы (2)


Я предлагаю вам использовать метод addData, который принимает URL-адрес файла, а не массив байтов, поскольку вы можете превысить память устройства с версией массива байтов (например, для большего видео или устройства с малой памятью).

Вы можете прочитать ответ, как и любой другой запрос на подключение:

  1. Получите запрос на подключение и переопределите: protected void readResponse(InputStream input)
  2. Используйте addResponseListener для привязки слушателя к ответу пользователя.
  3. Используйте addToQueueAndWait, чтобы определить, что загрузка завершена, а затем просто вызовите getResponseData(), чтобы получить данные массива байтов.
person Shai Almog    schedule 25.05.2014
comment
Эй, Шай, спасибо за ответ. Проверьте обновленный метод. Я все еще не получаю ответа. - person Christian; 25.05.2014
comment
В случае, если это ответ об ошибке, он может быть отправлен в поток ошибок, поэтому, чтобы прочитать это, обязательно вызовите setReadResponseForErrors(true). Также вы можете захотеть переопределить метод кода ответа, чтобы обрабатывать коды ошибок. В другой теме чтение по одному байту за раз из потока ДЕЙСТВИТЕЛЬНО медленное! Попробуйте Util.readToString(InputStream). - person Shai Almog; 25.05.2014
comment
Шай, я все еще не получаю ответа об ошибке. Я обновил свой код до последней версии. Что-то не так с этим? - person Christian; 27.05.2014
comment
Что вы получаете в логах? Вы получили код ответа? На каких платформах вы тестировали это? - person Shai Almog; 27.05.2014
comment
Эй, Шай, в логах ничего нет. Использование Windows-машины. Я продолжу и создам приложение для Android из исходных файлов и посмотрю, получу ли я что-нибудь таким образом. - person Christian; 28.05.2014
comment
Никто? Нет даже журнала кодов ошибок или заголовков? Вы уверены, что этот код выполняется правильно? Вы запускали его через отладчик? - person Shai Almog; 29.05.2014

У меня такая же проблема! на серверной части я использую Spring boot, мой контроллер загрузки был просто помечен как @Controller при изменении на @RestController, он работал нормально, и я получил обратный вызов readResponse(InputStream input), где я обрабатываю ответ как JSON.

person F.Q.    schedule 06.05.2020