2010-10-12 16 views
10

Jako część mojej aplikacji na Androida chciałbym przesłać mapy bitowe do zdalnego zapisania. Mam prostą komunikację HTTP GET i POST działającą doskonale, ale dokumentacja jak wykonać wieloczęściowy test POST wydaje się być tak rzadka jak jednorożce.Przesyłanie z wieloma Androidami

Co więcej, chciałbym przesłać obraz bezpośrednio z pamięci, zamiast pracować z plikiem. W przykładowym kodzie poniżej otrzymuję tablicę bajtów z pliku, który będzie później używany z HttpClient i 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); 

To wszystko wydaje się dość oczywiste dla mnie, poza tym, że nie mogę dla życia mnie dowiedzieć się, skąd wziąć tę ByteArrayPartSource. Łączę się z plikami JAR httpclient i httpmime, ale nie ma kości. Słyszałem, że struktura pakietu zmieniła się drastycznie między HttpClient 3.x a 4.x.

Czy ktoś używa tego ByteArrayPartSource w systemie Android i jak je zaimportował?

Po kopaniu dokumentacji i przeszukiwaniu Internetu wymyśliłem coś, co pasuje do moich potrzeb. Aby dokonać wieloczęściowy żądanie takie jak formularze POST poniższy kod wystarczyły dla mnie:

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); 

Bit HTTPMultipartMode.BROWSER_COMPATIBLE jest bardzo ważne. Dzięki temu Radomir's blog.

+0

Jeśli ktoś stara się rozwiązać import MultipartEntity. Zobacz ten wpis na blogu z linkami do http: //blog.tacticalnuclearstrike słoika.com/2010/01/using-multipartentity-in-android-applications/ – Blundell

+1

Dzięki za to. Miałem ten sam problem. Z wyjątkiem tego, co mnie martwi, to to, że rozmiar pliku mojej aplikacji jest 3 lub 4 razy większy. Zastanawiam się, czy może istnieć sposób na proste dodanie obsługi wieloczęściowej zamiast ładowania 4 słoików. –

Odpowiedz

2

spróbuj tego:

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

Należy pamiętać, że funkcja MultipartEntity nie zawiera interfejsu API systemu Android. Zobacz tę odpowiedź, aby uzyskać odpowiednie klasy: http://stackoverflow.com/a/5220954/28688 – dermatthias

0

Mam ten sam problem. Próbuję przesłać obraz przez MultiPart Entity i widzi, że kilka aktualizacji w HttpClient/MIME psuje wszystko. Próbuję poniższy kod, spadając z Error „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) {} 
} 

Metoda ta jest całkowicie compilable i wykorzystuje httpclient-4.0.1.jar i httpmime-4.2.jar bibliotekami, ale jeszcze raz, pamiętam, że ścina w komentowanej linii dla mnie.

1

Być może możesz wykonać następujące czynności, aby zaimportować bibliotekę do systemu Android.

wymóg biblioteka - apache-mime4j-0.6.jar - httpmime-4.0.1.jar

  1. prawym przyciskiem myszy projekt, a następnie kliknij właściwości
  2. wybierz java build path
  3. wybierz zakładkę o nazwie "Zamów i wyeksportuj"
  4. Zastosuj to
  5. Całkowicie odinstaluj plik APK z debiutorem programu adb z powodu istniejącej apk nie obsługuje nowej biblioteki
  6. zainstalować ponownie swoją apk
  7. uruchomić go

Pozdrawiamy,

jenz