2010-10-12 2 views
10

Как часть моего приложения для Android, я хотел бы загрузить растровые изображения, которые будут храниться удаленно. У меня простая HTTP GET и POST-связь, работающая отлично, но документация о том, как делать многостраничную POST, кажется такой же редкой, как единороги.Android Multipart Загрузить

Кроме того, я хотел бы передать изображение непосредственно из памяти вместо работы с файлом. В приведенном ниже примере кода я получаю байтовый массив из файла, который будет использоваться позже с HttpClient и MultipartEntity.

File input = new File("climb.jpg"); 
    byte[] data = new byte[(int)input.length()]; 
    FileInputStream fis = new FileInputStream(input); 
    fis.read(data); 

    ByteArrayPartSource baps = new ByteArrayPartSource(input.getName(), data); 

Это все кажется довольно ясно для меня, за исключением того, что я не могу за жизнь мне выяснить, где, чтобы получить эту ByteArrayPartSource. Я связан с файлами httpclient и httpmime JAR, но не с кубиками. Я слышал, что структура пакета резко изменилась между HttpClient 3.x и 4.x.

Кто-нибудь использует этот ByteArrayPartSource в Android, и как они его импортировали?

После того, как в документации и прочистите Интернет, я придумал что-то, что соответствует моим потребностям. Для того, чтобы сделать многослойный запрос, такими как форма POST, следующий код сделал трюк для меня:

File input = new File("climb.jpg"); 

    DefaultHttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost("http://localhost:3000/routes"); 
    MultipartEntity multi = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
    String line; 

    multi.addPart("name", new StringBody("test")); 
    multi.addPart("grade", new StringBody("test")); 
    multi.addPart("quality", new StringBody("test")); 
    multi.addPart("latitude", new StringBody("40.74")); 
    multi.addPart("longitude", new StringBody("40.74")); 
    multi.addPart("photo", new FileBody(input)); 
    post.setEntity(multi); 

    HttpResponse resp = client.execute(post); 

HTTPMultipartMode.BROWSER_COMPATIBLE бит очень важен. Благодаря Radomir's blog на этом.

+0

Если кто-то ищет, чтобы разрешить импорт MultipartEntity. Проверьте это сообщение в блоге со ссылками на http: //blog.tacticalnuclearstrike jar.com/2010/01/using-multipartentity-in-android-applications/ – Blundell

+1

Спасибо за это. У меня была такая же проблема. Кроме того, меня беспокоит то, что размер моего приложения в 3 или 4 раза больше. Интересно, может ли быть способ просто добавить поддержку multipart вместо загрузки 4 банок. –

ответ

2

попробовать это:

HttpClient httpClient = new DefaultHttpClient() ; 

HttpPost httpPost = new HttpPost("http://example.com"); 
MultipartEntity entity = new MultipartEntity();  
entity.addPart("file", new FileBody(file)); 
httpPost.setEntity(entity); 
HttpResponse response = null; 

try { 
    response = httpClient.execute(httpPost); 
} catch (ClientProtocolException e) { 
    Log.e("ClientProtocolException : "+e, e.getMessage());   
} catch (IOException e) { 
    Log.e("IOException : "+e, e.getMessage()); 

} 
+1

Обратите внимание: MultipartEntity не включен в API Android. См. Этот ответ для получения соответствующих классов: http://stackoverflow.com/a/5220954/28688 – dermatthias

0

я с той же проблемой. Я пытаюсь загрузить изображение через MultiPart Entity, и он видит, что несколько обновлений на HttpClient/MIME взламывают все. Я пытаюсь следующий код, падение с ошибкой «NoClassDefFoundError»:

public static void executeMultipartPost(File image, ArrayList<Cookie> cookies, String myUrlToPost) { 
    try { 
     // my post instance 
     HttpPost httppost = new HttpPost(myUrlToPost); 
     // setting cookies for the connection session 
     if (cookies != null && cookies.size() > 0) { 
      String cookieString = ""; 
      for (int i=0; i<cookies.size(); ++i) { 
       cookieString += cookies.get(i).getName()+"="+cookies.get(i).getValue()+";"; 
      } 
      cookieString += "domain=" + BaseUrl + "; " + "path=/"; 
      httppost.addHeader("Cookie", cookieString); 
     } 
     // creating the http client 
     HttpClient httpclient = new DefaultHttpClient(); 
     // creating the multientity part [ERROR OCCURS IN THIS BELLOW LINE] 
     MultipartEntity multipartEntity = new MultipartEntity(); 
     multipartEntity.addPart("photoupload", new FileBody(image)); 
     httppost.setEntity(multipartEntity); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity resEntity = response.getEntity(); 
    } catch (Exception e) {} 
} 

Этот метод является полностью компилируется и использует httpclient-4.0.1.jar и httpmime-4.2.jar LIBS, но опять же, я помню, что он вылетает в комментировал линии для меня.

1

Возможно, вы можете сделать следующий шаг для импорта библиотеки на свой Android.

требование библиотека - апач-mime4j-0.6.jar - httpmime-4.0.1.jar

  1. правой кнопкой мыши проект и выберите Свойства
  2. выберите Java путь сборки
  3. Выберите вкладку под названием «Заказ и экспорт»
  4. Нанесите его
  5. Полностью удалить ваш файл apk с удалением adb из-за существующего apk не для новой библиотеки
  6. установить снова ваш APK
  7. запустить его

Спасибо,

Jenz

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