httpClient, проблема с выполнением POST для Multipart в режиме Chunked

Ну, мне интересно, как я могу опубликовать составную часть в режиме фрагментов. У меня есть 3 части, и файлы могут быть большими, поэтому их нужно отправлять кусками.

Вот что я делаю:

    MultipartEntity multipartEntity = new MultipartEntity() {
        @Override
        public boolean isChunked() {
            return true;
        }
    };

    multipartEntity.addPart("theText", new StringBody("some text", Charset.forName("UTF-8")));

    FileBody fileBody1 = new FileBody(file1);
    multipartEntity.addPart("theFile1", fileBody1);

    FileBody fileBody2 = new FileBody(file2);
    multipartEntity.addPart("theFile2", fileBody2);

    httppost.setEntity(multipartEntity);

    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpClient httpClient = new DefaultHttpClient(params);

    HttpResponse httpResponse = httpClient.execute(httppost);

На стороне сервера я получаю 3 части, но файлы, например, не разбиты на части, они принимаются как одна часть ... в основном всего я вижу только 4 границы: 3 --xxx, 1 в конце --xxx -- . Я думал, что переопределение isChunked поможет, но нет... ;(

Возможно ли то, что я пытаюсь сделать? Как я мог заставить это работать?

Большое спасибо. Потрясающе


person Fab    schedule 26.08.2011    source источник


Ответы (2)


Чтобы сгенерировать составное тело, разделенное на части, размер одной из частей должен быть недоступен. Как часть, которая течет.

Например, предположим, что ваш файл2 — это действительно большое видео. Вы можете заменить часть своего кода:

FileBody fileBody2 = new FileBody(file2);
multipartEntity.addPart("theFile2", fileBody2);

с этим кодом:

final InputStreamBody binVideo = new InputStreamBody(new FileInputStream(file2), "video/mp4", file2.getName());
multipartEntity.addPart("video", binVideo);

поскольку теперь третья часть представляет собой InputStream, а не файл, ваш составной HTTP-запрос будет иметь заголовок Transfer-Encoding: chunked.

person Martin P.    schedule 18.07.2012

Обычно любая приличная HTTP-инфраструктура на стороне сервера (например, Java EE Servlet API) скрывает детали транспорта, такие как кодирование передачи, из кода приложения. тот факт, что вы не видите разделителей фрагментов при чтении из потока содержимого, не означает, что кодирование фрагментов не использовалось базовым HTTP-транспортом.

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

http://hc.apache.org/httpcomponents-client-ga/logging.html

person ok2c    schedule 26.08.2011