httpClient, проблема сделать POST Multipart в режиме Chunked ... - PullRequest
1 голос
/ 26 августа 2011

Ну, мне интересно, как я могу добиться публикации нескольких частей в чанкованном режиме. У меня есть 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 поможет, но нет ...; (

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

Большое спасибо. Fab

Ответы [ 2 ]

2 голосов
/ 18 июля 2012

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

Например, допустим, ваш файл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 вместо File, ваш многочастный HTTP-запрос будет иметь заголовок Transfer-Encoding: chunked .

0 голосов
/ 26 августа 2011

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

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

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

...