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.