10 Stimmen

Android Multipart Upload

Als Teil meiner Android-App möchte ich Bitmaps hochladen, um sie aus der Ferne zu speichern. Ich habe einfache HTTP GET und POST-Kommunikation perfekt funktioniert, aber die Dokumentation auf, wie ein Multipart POST zu tun scheint, so selten wie Einhörner sein.

Außerdem würde ich das Bild gerne direkt aus dem Speicher übertragen, anstatt mit einer Datei zu arbeiten. Im Beispielcode unten erhalte ich ein Byte-Array aus einer Datei, das später mit HttpClient und MultipartEntity verwendet werden soll.

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

Dies alles scheint ziemlich klar zu mir, außer dass ich nicht für das Leben von mir herausfinden kann, wo diese ByteArrayPartSource zu erhalten. Ich habe einen Link zu den httpclient und httpmime JAR-Dateien, aber keine Würfel. Ich höre, dass die Paketstruktur drastisch zwischen HttpClient 3.x und 4.x geändert.

Ist jemand mit dieser ByteArrayPartSource in Android, und wie haben Sie es importieren?

Nachdem ich mich durch die Dokumentation gewühlt und das Internet durchforstet hatte, fand ich etwas, das meinen Bedürfnissen entsprach. Um eine mehrteilige Anforderung wie ein POST-Formular zu erstellen, hat der folgende Code den Trick für mich erledigt:

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

Das Bit HTTPMultipartMode.BROWSER_COMPATIBLE ist sehr wichtig. Dank Radomir's Blog in diesem Fall.

2voto

nont Punkte 9034

Versuchen Sie dies:

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

 }

1voto

user1643442 Punkte 11

Vielleicht können Sie folgende Schritte durchführen, um die Bibliothek in Ihr Android zu importieren.

Anforderungsbibliothek - apache-mime4j-0.6.jar - httpmime-4.0.1.jar

  1. Klicken Sie mit der rechten Maustaste auf Ihr Projekt und dann auf Eigenschaften
  2. Java-Build-Pfad auswählen
  3. Wählen Sie die Registerkarte "Bestellung und Export".
  4. Anwenden
  5. Deinstallieren Sie die apk-Datei mit adb uninstall vollständig, da die vorhandene apk nicht für die neue Bibliothek geeignet ist.
  6. Installieren Sie Ihre apk erneut
  7. es betreiben

Danke,

Jenz

0voto

Marcelo Punkte 2035

Ich habe das gleiche Problem. Ich versuche, ein Bild durch MultiPart Entity hochzuladen und es scheint, dass die verschiedenen Updates auf HttpClient/MIME alles knacken. Ich versuche, den folgenden Code, fallen mit einem Fehler " 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) {}
}

Diese Methode ist vollständig kompilierbar und verwendet die httpclient-4.0.1.jar y httpmime-4.2.jar libs, aber auch hier erinnere ich mich, dass es in der kommentierten Zeile für mich abstürzt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X