2016-07-30 4 views
0

Я пытаюсь написать код Java, чтобы делать то, что эта команда делает:Java эквивалент завиток запроса поста с изображением и текстом

curl -F "[email protected]" -F "param1=some-value" -F "param2=some_value" http://example.com 

Я в настоящее время пытаюсь что-то вроде этого:

HttpClient httpClient = HttpClientBuilder.create().build(); 
HttpPost poster = new HttpPost("http://example.com"); 
MultipartEntityBuilder mpEntityBuilder = MultipartEntityBuilder.create(); 
mpEntityBuilder.addPart("param1", new StringBody("some-value")); 
mpEntityBuilder.addPart("param2", new StringBody("some-value")); 
mpEntity.addPart("image", getImage("some-image")); 
poster.setEntity(mpEntityBuilder .build()); 
HttpResponse response = httpClient.execute(poster); 

здесь getImage (String) возвращает ByteArrayBody. (Я фактически загружаю изображение из Интернета на лету, а не читаю с диска, как команда curl, но я не думаю, что это должно измениться)

Я проверил эту ссылку, но это не так, т точно рассмотреть случай, когда вы посылаете как изображение, а также параметры текста: Java Equivalent of curl query

что странно, что я использую почти один и тот же код, чтобы сделать HTTP POST на другой API, который прекрасно работает, когда мне нужно для отправки изображения без текстовых параметров. (no stringbody)

Но когда я пытаюсь отправить как изображение (как ByteArrayBody), так и некоторый текст (как StringBody), я получаю сообщение об ошибке с сервера, которое говорит что-то вроде: 'Не удалось инициализировать объект параметра с помощью mimeType: application/octet-stream '. Это, вероятно, настраиваемое сообщение об ошибке, поэтому я не могу найти много информации об этом.

Я попытался использовать несколько других constuctors для StringBody(), поскольку этот устарел, но это не помогло. Не уверен, что использовать правильный конструктор, но не уверен, что это вызовет проблему.

Edit: Похоже, кто-то спросил очень подобный вопрос раньше, но решение не работает для меня: Android: upload file with filling out POST body together Я получаю сообщение об ошибке о Ошибка инициализации параметров с MIMETYPE: приложения/октет-поток)

+0

Я считаю, что вам понадобится Base64Encode изображение. Взгляните на http://stackoverflow.com/questions/5416038/uploading-image-to-server-in-multipart-along-with-json-data-in-android – GreyBeardedGeek

+0

Спасибо, я проверю это. Но это не объясняет, почему приведенный выше код отлично работает для выполнения этой команды curl: curl -F "file" = "@ example.png" "https://example.com" – kerouac

ответ

1

Я не вижу документально, но curl -F @, очевидно, пытается быть полезным заполняет Content-type для некоторых расширений/суффиксов, включая image/jpeg для .jpg. HttpClient не делает, и по умолчанию все указывает на MIME «Не знаю» типа application/octet-stream, который предположительно вызвал вашу ошибку. Используйте 3-Arg т е р, который устанавливает тип содержимого

new ByteArrayBody (data, ContentType.create("image/jpeg"), null) 

или если вы хотите, чтобы указать атрибут имени файла, который curl -F @ также делает, но веб-серверы (в отличие от браузеров) обычно не волнует , поставьте String вместо третьего аргумента null.

+0

Вы гений! Я оставил после поиска повсюду. – kerouac

Смежные вопросы