2010-03-30 13 views
6

Ich brauche ein Bild zu einem Remote-PHP-Server hochladen, die die folgenden Parameter in Httppost erwartet:Hochladen von Bildern auf einen PHP-Server von Android

*$_POST['title']* 
*$_POST['caption']* 
*$_FILES['fileatt']* 

Die meisten der Internet-Recherchen vorgeschlagen entweder:

Laden Sie die folgenden Klassen und versuchen MultiPartEntity die Anfrage zu senden:

apache-mime4j-0.5.jar 
httpclient-4.0-beta2.jar 
httpcore-4.0-beta3.jar 
httpmime-4.0-beta2.jar 

OR

Verwenden Sie URLconnection und behandeln Sie mehrteilige Daten selbst.

Btw, ich bin scharf auf die Verwendung der HttpClient-Klasse statt java.net (oder ist es android.net) Klassen. Schließlich habe ich die Multipart-Klassen aus dem Android-Quellcode heruntergeladen und stattdessen in meinem Projekt verwendet.

Obwohl dies mit einer der oben genannten Methoden durchgeführt werden kann, würde ich gerne sicherstellen, ob dies die einzige Möglichkeit ist, das genannte Ziel zu erreichen. Ich überflog die Dokumentation und fand eine FileEntity Klasse, aber ich konnte es nicht zum Laufen bringen.

Was ist der richtige Weg, um dies in einer Android-Anwendung zu erreichen?

Danke.

+0

Für eine einfache Implementierung siehe meine [post] (http://vikaskanani.wordpress.com/2011/01/11/android-upload-image-or-file-using-http-post-multi-part/). – Vikas

Antwort

5

Die Android-Quelle scheint mit einer internen mehrteiligen Helfer Bibliothek zu kommen. See this post. Auf den ersten Blick ist es besser dokumentiert als viele öffentliche APIs (Hustenhusten, SoundPool, Hustenhusten), also sollte es ein guter Ausgangspunkt sein, oder vielleicht auch nur eine Drop-In-Lösung.

+0

Ja, ich habe diesen Thread auch gesehen und es geschafft, das "multipart" -Paket herunterzuladen und es zu benutzen, indem ich nur die Paketnamen ändere. Danke für deine Antwort. – Samuh

+1

Sie können auch das offizielle Apache HTTPMime-Projekt ausprobieren: http://hc.apache.org/httpcomponents-client/httpmime/apidocs/index.html Es basiert auf Mime4j und ich habe es nicht persönlich benutzt, aber es scheint so zu sein beabsichtigen, Multipart auf HTTPClient 4 zu tun; es würde wahrscheinlich mit dem Android HTTPClient funktionieren, aber ich kann nicht sicher sagen. –

3

Ich mache genau das, um mit einem Bildhosting-Server zu interagieren (auch in PHP implementiert), der Parameter erwartet, als wären sie von einer HTML-Seite gepostet worden.

baue ich eine List<NameValuePair> meiner Schlüssel und Werte etwas wie folgt aus:

List<NameValuePair> params = new ArrayList<NameValuePair>(2); 
    params.add(new BasicNameValuePair(key1, value1)); 
    params.add(new BasicNameValuePair(key2, value2)); 

und dann gebe ich es auf meine http Helfer Klasse, die die HttpEntity Eigenschaft meiner Httppost Anfrage stellt. Hier ist die Methode direkt aus meiner Hilfsklasse:

public static HttpResponse Post(String url, List<NameValuePair> params, Context context) 
{ 
    HttpResponse response = null; 
    try 
    { 
     HttpPost request = new HttpPost(); 
     request.setURI(new URI(url)); 
     if(params != null) 
      request.setEntity(new UrlEncodedFormEntity(params)); 
     HttpClient client = ((ApplicationEx)context.getApplicationContext()).getHttpClient(); 
     response = client.execute(request); 
    } 
    catch(Exception ex) 
    { 
     // log, etc 
    } 
    return response; 
} 
+0

Welche Art von Entitätsobjekt erstellen Sie genau zum Einkapseln eines Dateiobjekts? – Samuh

+0

Nun ... wenn ich beide Seiten des Vertrags besitze, würde ich das $ _FILES-Array nicht verwenden ... Ich würde ein reguläres Schlüssel/Wert-Paar als Post-Parameter senden, wobei der Wert ein Bytestrom ist. Wenn ich nur den Client besitze und der Server strikt die $ _FILES-Sachen benötigt, würde ich eine Test-HTML-Seite mit einem einfachen Formular erstellen, das genau das tut (Datei-Upload), es mit Fiddler verfolgen und die Post-Payload manuell nachbilden die Header und die Nutzlast. Der Browser erstellt eine "Begrenzungs" -Zeichenfolge, teilt dem Server über einen Header mit, was die Grenze ist, und umschließt dann den Byte-Stream in dieser Grenze. Sie können das Gleiche tun. – Rich

+0

Das ist genau das, was ich meinte, als ich sagte: Use URLconnection und handle mehrteilige Daten selbst. Was ich wirklich will, ist eine Klasse wie MultipartEntity, die das alles für mich behandeln. Leider wurde diese Klasse nicht Android importiert. Die Dokumentation erfasst jedoch eine FileEntity-Klasse und ich frage mich, wie ich sie verwenden soll. – Samuh

4

Vielleicht hilft diese post auf der offiziellen Android-Gruppe. Der Typ benutzt mime4j.

Eine weitere hilfreiche Ressource könnte this example im Pro Android Buch sein.

Verwandte Themen