Android отправляет изображение на сервер с помощью MultipartEntity

Я пытался загрузить изображение и данные на сервер Django. Я включил библиотеки apache-mime4j.0.6.jar и httpmime4.0.1.jar ( Project-> build path-> Add external jar files) И вот код для загрузки изображения.

HttpResponse response = null;
try {
    HttpPost httppost = new HttpPost("http://10.0.2.2:8000/mobile");
    //  HttpPost httppost = new HttpPost("some url");

    MultipartEntity multipartEntity = new MultipartEntity(); //MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);  
    multipartEntity.addPart("name", new StringBody("nameText"));
    multipartEntity.addPart("place", new StringBody("placeText"));
    multipartEntity.addPart("tag", new StringBody("tagText"));
    //multipartEntity.addPart("Description", new StringBody(Settings.SHARE.TEXT));
    multipartEntity.addPart("Image", new FileBody(destination));
    httppost.setEntity(multipartEntity);

    httpclient.execute(httppost, new PhotoUploadResponseHandler());

  } catch (Exception e) {
    Log.e( "Error","error");
  } 

Сообщение об ошибке:

Could not find class 'org.apache.http.entity.mime.MultipartEntity'

И я попытался вручную создать папку libs и вручную включить файлы jar в папку /libs. Когда я это делаю, он не компилируется.

Ошибка:

Conversion to Dalvik format failed with error 1  Unknown Android Packaging Problem

Пробовал создавать свежее приложение, включая библиотеки. И я столкнулся с той же ошибкой. Я пробовал все возможное. Может ли кто-нибудь сказать мне, почему это происходит и как это исправить. Любая помощь будет принята с благодарностью!


person Geetanjali    schedule 02.11.2012    source источник


Ответы (4)


Если вы используете новый android-sdk Попробуйте это.

  1. Создайте папку с именем libs
  2. Вставьте файл jar в эту папку.
  3. И, наконец, щелкните правой кнопкой мыши свой проект > Путь сборки > Добавить внешний архив.

Вот и все. Это может помочь. Удачи.

person Akshay    schedule 02.11.2012
comment
Да, я сделал то же самое. я упомянул об этом - person Geetanjali; 02.11.2012
comment
Выполнили ли вы шаги, которые я упоминаю, потому что тогда он не должен выдавать ошибку «класс не найден». Если вы только что добавили библиотеку, используя то, как вы это сделали, это не сработает. предыдущий sdk, но с новым он не будет работать. :) - person Akshay; 02.11.2012

Я загружаю изображение с Android на сервер Django, используя httpmime-4.2.1.jar. Это единственная библиотека, которую я включил, и она отлично работает. Кстати: библиотеки должны находиться в папке libs в проектах Android.

это код, который я использую для загрузки.

private JSONObject uploadImage(String url, File img) throws Exception{
    url = addAuthToken(url);
    HttpPost post = new HttpPost(url);
    MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    FileBody fileBody = new FileBody(img, "images/jpeg");
    reqEntity.addPart("image", fileBody);
    post.setEntity(reqEntity);

    JSONObject ret = baseRequest(post);
    checkReturnStatus(ret, 201);

    return ret;
}

private JSONObject baseRequest(HttpUriRequest request) throws Exception{
    HttpClient client = new DefaultHttpClient();
    HttpResponse response = client.execute(request);
    BufferedReader in = null;
    try{
        in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        StringBuffer sb = new StringBuffer();
        String line = null;
        String NL = System.getProperty("line.separator");
        while ((line = in.readLine()) != null) {
            sb.append(line + NL);
        }

        return new JSONObject(sb.toString());
    }finally {
        if(in != null) in.close();
    }
}
person SimonSays    schedule 02.11.2012
comment
Библиотека jar находится в папке libs? Это необходимо для его корректной упаковки в APK. Вы можете удалить и добавить его еще раз. Перетащите его из проводника прямо в папку в eclipse. Затем вы должны увидеть его в разделе «Зависимости Android», где вы можете открыть его и посмотреть, есть ли в нем нужный класс. - person SimonSays; 02.11.2012
comment
не могли бы вы привести пример использования, пожалуйста..? Было бы очень полезно - person Droidman; 14.12.2012

Я предлагаю вам использовать spring-android. Это хорошая библиотека API для отдыха для Android и с Spring- Android, вы можете легко загрузить файл, как это.

HttpHeaders requestHeaders = ....
MultiValueMap<String, Object> message = new LinkedMultiValueMap<String, Object>();
message.add("qqfile", new FileSystemResource(filePath)); //attach file

HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(
            message, requestHeaders);
 RestTemplate restTemplate = RestUtil.getRestTemplate( context);
 ResponseEntity<YourResultDTO> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity,YourResultDTO.class);

Как предлагает Google, очень легко использовать и использовать http-клиент Apache на предварительном имбирном прянике и java.net.urlconnection на имбирном прянике и более высоком уровне API.

person kingori    schedule 02.11.2012
comment
что такое РестУтил? Это не может быть решено даже после того, как я импортировал 9 загруженных пакетов... и что такое YourResultDTO? - person Droidman; 14.12.2012
comment
Вы должны заменить YourResultDTO на свой собственный класс DTO. Это будет объект результата, который содержит результат с сервера, и если вы правильно настроите spring-android, spring-android будет обрабатывать результат синтаксического анализа json/xml. - person kingori; 15.12.2012

У меня была та же проблема, и я решил ее следующим образом: в окне пути сборки java щелкните вкладку «Заказ и экспорт», выделите библиотеку, которую хотите добавить, затем нажмите «вверх» (загрузить библиотеку первой)

Нажмите ок и все в порядке.

Вот ссылка с фотографиями (Android Eclipse NoClassDefFoundError для внешних файлов .jar)

person Ravtech developer    schedule 13.05.2014