2016-07-30 9 views
0

Ich versuche, Java-Code zu schreiben, genau das zu tun, was dieser Befehl tut:Java Äquivalent curl Post Anfrage mit Bild und Text

curl -F "[email protected]" -F "param1=some-value" -F "param2=some_value" http://example.com 

Ich bin derzeit so etwas wie dies versuchen:

HttpClient httpClient = HttpClientBuilder.create().build(); 
HttpPost poster = new HttpPost("http://example.com"); 
MultipartEntityBuilder mpEntityBuilder = MultipartEntityBuilder.create(); 
mpEntityBuilder.addPart("param1", new StringBody("some-value")); 
mpEntityBuilder.addPart("param2", new StringBody("some-value")); 
mpEntity.addPart("image", getImage("some-image")); 
poster.setEntity(mpEntityBuilder .build()); 
HttpResponse response = httpClient.execute(poster); 

Hier gibt getImage (String) ein ByteArrayBody zurück. (Ich lade tatsächlich ein Bild aus dem Internet im laufenden Betrieb anstatt vom Datenträger wie der Befehl curl lesen, aber ich denke nicht, dass dies einen Unterschied machen sollte)

Ich habe diesen Link überprüft es aber es nicht ' t genau den Fall ansprechen, wo man sowohl ein Bild als auch Text-Parameter sind zu senden: Java Equivalent of curl query

Was seltsam ist, dass ich fast den gleichen Code bin mit einem HTTP-Post an eine andere API zu machen, die gut funktioniert, wenn ich brauche um ein Bild ohne Textparameter zu senden. (no stringbody)

Aber wenn ich versuche, sowohl ein Bild (als ByteArrayBody) als auch Text (als StringBody) zu senden, bekomme ich eine kryptische Fehlermeldung vom Server, die so etwas sagt: 'Konnte nicht initialisiert das Parameterobjekt mit mimeType: application/octet-stream '. Es ist wahrscheinlich eine benutzerdefinierte Fehlermeldung, so dass ich nicht wirklich viele Informationen dazu finden kann.

Ich habe versucht, ein paar andere Bausteine ​​für StringBody() zu verwenden, da dieser veraltet ist, aber es hat nicht geholfen. Nicht sicher, was der richtige Konstruktor zu verwenden ist, aber nicht sicher, ob dies ein Problem verursachen würde.

Edit: scheint, wie jemand fragte eine sehr ähnliche Frage vor, aber die Lösung funktioniert nicht für mich: Android: upload file with filling out POST body together Ich erhalte eine Fehlermeldung über Fehlgeschlagen Parameterinitialisierung mit mime: application/octet-stream)

+0

Ich glaube, dass Sie Base64Encode das Bild codieren müssen. Werfen Sie einen Blick auf http://stackoverflow.com/questions/5416038/uploading-image-to-server-in-multipart-along-with-json-data-in-android – GreyBeardedGeek

+0

Danke, ich werde es überprüfen. Aber es würde nicht erklären, warum der obige Code gut funktioniert, um zu tun, was dieser curl-Befehl macht: curl -F "Datei" = "@ example.png" "https://example.com" – kerouac

Antwort

1

Ich sehe es nicht dokumentiert, aber curl -F @ scheinbar versucht, hilfreich zu sein füllt Content-type für einige Erweiterungen/Suffixe, einschließlich image/jpeg für .jpg. HttpClient nicht, und standardmäßig alles auf die MIME "Ich weiß nicht" Typ application/octet-stream, die vermutlich Ihren Fehler verursacht. Verwenden Sie die 3-arg Ctor, die den Content-Type setzt

new ByteArrayBody (data, ContentType.create("image/jpeg"), null) 

oder wenn Sie wollen den Dateinamen-Attribut angeben, welche curl -F @ auch tut, aber Web-Server (im Gegensatz zu Browser) in der Regel nicht über egal , liefern Sie ein String anstelle des dritten Arguments null.

+0

Du bist ein Genie! Ich hatte aufgegeben, nachdem ich überall gesucht hatte. – kerouac