Загрузить фотографию с помощью HttpPost MultiPartEntityBuilder

Я пытаюсь загрузить полученную фотографию на сервер. вот что я делаю:

public JSONObject makePostFileRequest(String url, String photoFile) { try { // photoFile = /path/tofile/pic.jpg DefaultHttpClient httpClient = GlobalData.httpClient; HttpPost httpPost = new HttpPost(url); File file = new File(photoFile); FileBody fileBody = new FileBody(file); // here is line 221 MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create(); multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); multipartEntity.addPart("PhotoMessage", fileBody); httpPost.setEntity(multipartEntity.build()); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); 

Я получаю эту ошибку:

11-29 13: 12: 14.924: E / AndroidRuntime (15781): вызвано: java.lang.NoClassDefFoundError: org.apache.http.entity.ContentType 11-29 13: 12: 14.924: E / AndroidRuntime (15781): На org.apache.http.entity.mime.content.FileBody. (FileBody.java:89) 11-29 13: 12: 14.924: E / AndroidRuntime (15781): at com.petcial.petopen.custom.JSONParser.makePostFileRequest (JSONParser.java:221)

Что я делаю не так?


Обновить

 InputStream inputStream; inputStream = new FileInputStream(new File(photoFile)); byte[] data; data = IOUtils.toByteArray(inputStream); httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT, System.getProperty("http.agent")); InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data), "Pic.jpg"); MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create(); multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); multipartEntity.addPart("PhotoMessage", inputStreamBody); httpPost.setEntity(multipartEntity.build()); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); 

Вот ошибка:

11-29 14: 00: 33.364: E / AndroidRuntime (19478): вызвано: java.lang.NoClassDefFoundError: org.apache.http.util.Args 11-29 14: 00: 33.364: E / AndroidRuntime (19478): (Org.apache.http.entity.mime.content.AbstractContentBody. .InputStreamBody. (InputStreamBody.java:69) 11-29 14: 00: 33.364: E / AndroidRuntime (19478): at org.apache.http.entity.mime.content.InputStreamBody. (InputStreamBody.java:62) 11- 29 14: 00: 33.364: E / AndroidRuntime (19478): at com.petcial.petopen.custom.JSONParser.makePostFileRequest (JSONParser.java:233)

Эти библиотеки решили мою проблему:

Solutions Collecting From Web of "Загрузить фотографию с помощью HttpPost MultiPartEntityBuilder"

Введите описание изображения здесь Проверьте этот флажок на вкладке «Заказ и экспорт» и запустите.

Есть мое рабочее решение для отправки изображения с сообщением, используя apache http-библиотеки (очень важно здесь добавить границу. Он не будет работать без него в моем соединении):

 ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] imageBytes = baos.toByteArray(); HttpClient httpclient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(StaticData.AMBAJE_SERVER_URL + StaticData.AMBAJE_ADD_AMBAJ_TO_GROUP); String boundary = "-------------" + System.currentTimeMillis(); httpPost.setHeader("Content-type", "multipart/form-data; boundary="+boundary); ByteArrayBody bab = new ByteArrayBody(imageBytes, "pic.png"); StringBody sbOwner = new StringBody(StaticData.loggedUserId, ContentType.TEXT_PLAIN); StringBody sbGroup = new StringBody("group", ContentType.TEXT_PLAIN); HttpEntity entity = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .setBoundary(boundary) .addPart("group", sbGroup) .addPart("owner", sbOwner) .addPart("image", bab) .build(); httpPost.setEntity(entity); try { HttpResponse response = httpclient.execute(httpPost); ...then reading response 

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

 public class UploadProductDetails { public void uploadProductDetails(String filePath, String fileName) { InputStream inputStream; try { inputStream = new FileInputStream(new File(filePath)); byte[] data; try { data = IOUtils.toByteArray(inputStream); HttpClient httpClient = new DefaultHttpClient(); httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT, System.getProperty("http.agent")); HttpPost httpPost = new HttpPost("http://ipaddress"); InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data), "abc.png"); MultipartEntity multipartEntity = new MultipartEntity(); multipartEntity.addPart("file", inputStreamBody); httpPost.setEntity(multipartEntity); HttpResponse httpResponse = httpClient.execute(httpPost); // Handle response back from script. if(httpResponse != null) { //Toast.makeText(getBaseContext(), "Upload Completed. ", 2000).show(); } else { // Error, no response. //Toast.makeText(getBaseContext(), "Server Error. ", 2000).show(); } } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e1) { e1.printStackTrace(); } } } 

Обратите внимание, что использование этого кода: new InputStreamBody(new ByteArrayInputStream(yourByteArray)) может привести к некоторым проблемам, поскольку он возвращает -1 при вызове getContentLength() .

Вместо этого используйте это: new ByteArrayBody(yourByteArray)