2016-08-01 10 views
0

Ich habe folgende cURL, die in Bash funktioniert:POST-Anfrage mit Datei (Bild) und Text mit HttpURLConnection

$ curl -F "[email protected]/Users/my-name/Downloads/STARinside.jpg_256" -F "assetNumber=OS014005" -F "name=George" -F "make=Hamilton" -F "model=STAR" "http://exampleUrl.compute.amazonaws.com/Asmt3/updateInstrImage.php" 

aber ich kann nicht, diese Funktion in Android Studio zu recht zu bekommen scheinen. Hier ist ein Code, den ich ausprobiert habe, aber ich kann nicht zur Arbeit kommen. Ich kann den POST aller Parameter selbst erhalten (einschließlich des Bildes = @ Dateiname), aber es scheint, dass der Server (der PHP ist, den ich schrieb) nichts in $_FILES['image'] erhält, wie es von bash tut. Oder ich kann die tatsächliche Datei über einen bufferedOutputStream senden, aber dann erfasst es nichts sinnvolles im Array $_POST.

dieser Code ist in einer Verlängerung von AsyncTask, FTR:

HttpURLConnection conn = (HttpURLConnection) this.updateInstr.openConnection(); 
conn.setDoOutput(true); 
conn.setRequestMethod("POST"); 
//conn.setRequestProperty("Content-Type", "image/jpeg"); 
conn.setDoInput(true); 
params.append("assetNumber="); 
params.append(this.asset); 
params.append("&name="); 
params.append(InstrList.get(this.asset)); 
params.append("&make="); 
params.append(InstrMakes.get(this.asset)); 
params.append("&model="); 
params.append(InstrModels.get(this.asset)); 
params.append("&[email protected]"); 
params.append(image.getAbsoluteFile()); 
/* 
    conn.addRequestProperty("assetNumber", this.asset); 
    conn.addRequestProperty("name", InstrList.get(asset)); 
    conn.addRequestProperty("make", InstrMakes.get(asset)); 
    conn.addRequestProperty("model", InstrModels.get(asset)); 
*/ 
conn.setChunkedStreamingMode(bt.length); 
OutputStream out = new BufferedOutputStream(conn.getOutputStream()); 
byte[] b = params.toString().getBytes(StandardCharsets.US_ASCII); 
out.write(b); 
out.flush(); 
out.write(bt); 
out.flush(); 
out.close(); 

//fully open connection with conn.getInputStream 
InputStream in = new BufferedInputStream(conn.getInputStream()); 
in.read(bytes); 
in.close(); 
response = new String(bytes, "utf-8"); 
Log.d("response: ", response); 

Auch können Sie sehen, ich habe zu conn.addRequestProperty eine andere Art und Weise versucht. In dieser Implementierung habe ich versucht, b nach bt (POST nach FILE) zu schreiben.

Ich würde auf jeden Fall Hilfe zu schätzen wissen. Es scheint, dass ich in der Lage sein sollte, diesen cURL-Aufruf in Android Studio zu replizieren, aber ich kann es nicht ganz bekommen. Ich habe etwas hinzugefügt, um die php auf dem Server zu echo, so dass ich die Params korrekt zusammenbauen (die $_POST Array ist korrekt basierend auf einem print_r($_POST) Aufruf), aber die $_FILES Array ist leer von Android Studio (aber ist korrekt von bash-curl)

kurze Notiz, habe ich this other question zu finden, was sehr hilfreich ist und fast ausreichend, aber es scheint, dass die ByteArrayBody Klasse für Java diskutiert nicht für Android Studio existiert ziemlich

Antwort

0

Dies erwies sich als involviert, und ich brauchte mehrere verschiedene Quellen, die in SO und anderswo verstreut waren, um es (endlich) zum Laufen zu bringen.

Also, ich habe ein sehr detailliertes Beispiel auf meiner kostenlosen Amazon EC2 Instanz gepostet. Wenn jemand die Quelle nehmen und an anderer Stelle veröffentlichen möchte, würde ich mich freuen, wenn Sie den ursprünglichen Autor angeben. Vorerst:

http://ec2-54-213-243-1.us-west-2.compute.amazonaws.com/How-to/index.html

Der Kern ist, dass Sie AsyncTask erweitern müssen, aber Sie müssen auch die HTTP-Anforderung Zeichen für Zeichen bauen zu umreißen, welche Dateien (Byte-Strom) ist gegen ‚normale‘ Datenfelder .

die beteiligten Teil ist: doInBackground() Welche Anrufe: writeText()