2010-08-14 3 views
10

Versucht herauszufinden, was mit meinen Kodierungen falsch ist. Ich folgte einem Blogpost von here.Android Multipart HTTP Post sendet nicht den MIME-Typ der Datei

Ich habe es geschafft, die Codes zu erhalten, um die Datei tatsächlich auf einen PHP-Webdienst hochzuladen. Aus irgendeinem Grund, obwohl ich explizit den MIME-Typ für die Datei festgelegt habe, zeigt PHP, dass der MIME nur eine leere Zeichenfolge ist und daher zurückgewiesen wird.

Hier ist meine Codierungen:

public String SendPost(String fn, String bid, String caption, String uid, String APIKey, String postHash) 
     throws ParseException, ClientProtocolException, IOException { 
    HttpClient httpclient = new DefaultHttpClient(); 
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 

    HttpPost httppost = new HttpPost(UrbURL); 

    Log.i("POSTFN", fn); 
    Log.i("POSTFN", bid); 
    Log.i("POSTFN", caption); 
    Log.i("POSTFN", uid); 
    Log.i("POSTFN", APIKey); 
    Log.i("POSTFN", postHash); 

    String postAuth = uid + postHash; 
    postAuth = md5(postAuth); 
    postAuth = postAuth.substring(0, 16); 
    //Log.i("POSTAUTH", postAuth); 

    MultipartEntity mp = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

    /*File tempImg = new File(fn); 
    FileBody bin = new FileBody(tempImg, "image/jpg");*/ 
    mp.addPart("business_photo", new FileBody(new File(fn), "image/jpg")); 

    //StringBody s = new StringBody(bid, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("business_id", new StringBody(bid, "text/plain", Charset.forName("UTF-8"))); 

    //s = new StringBody(caption, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("photo_caption", new StringBody(caption, "text/plain", Charset.forName("UTF-8"))); 

    //s = new StringBody(uid, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("user_id", new StringBody(uid, "text/plain", Charset.forName("UTF-8"))); 

    //s = new StringBody(APIKey, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("apikey", new StringBody(APIKey, "text/plain", Charset.forName("UTF-8"))); 

    //s = new StringBody(postAuth, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("auth", new StringBody(postAuth, "text/plain", Charset.forName("UTF-8"))); 

    httppost.setEntity(mp); 

    String response = EntityUtils.toString(httpclient.execute(httppost).getEntity(), "UTF-8"); 

    httpclient.getConnectionManager().shutdown(); 

    return response; 
} 

Vielen Dank vor :)

+0

hallo kannst du mir bitte sagen, was 'charset' ist und was ich darauf eingestellt habe – SAndroidD

Antwort

5

Ich hatte das gleiche Problem und es nur fixiert.

Ich habe festgestellt, dass die Verwendung der HttpMultipartMode.BROWSER_COMPATIBLE verhinderte, dass der richtige MimeType in meiner Anfrage festgelegt wurde, wenn ein ByteArrayBody für ein Bild verwendet wurde. Ich nehme an, das ist wahrscheinlich das gleiche Problem, das Sie haben.

Wenn ich diese Zeile geändert:

arbeitete
MultipartEntity mp = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

zu

MultipartEntity mp = new MultipartEntity(); 

dann wurde der Mime-Typ richtig eingestellt und das Service-Upload.

Ich sehe, dass Leute die BROWSER_COMPATIBLE für die Lösung eines anderen Problems verwendet haben, aber hoffentlich brauchen Sie es nicht.

+0

Das hat mir geholfen. Danke vielmals! – pixelscreen

1

Wir haben das gleiche Problem hier. Mit HttpMultipartMode.BROWSER_COMPATIBLE wurde der korrekte Mimetype entfernt, der gesendet wird.

Leider ist die Verwendung des 'normalen' MultipartEntity() keine Option für uns, da auf diese Weise das Rails Backend die Anfragenbearbeitung durcheinander bringt.

Gibt es eine Möglichkeit, den Inhaltstyp des Multipart selbst festzulegen und HttpMultipartMode.BROWSER_COMPATIBLE zu verwenden?

1

Ich hatte das gleiche Problem für eine Weile für die Veröffentlichung von 3 FileBodies und 1 Mime Info, der Mime (in JSON) wurde nie empfangen, es sei denn, ich schickte nur einen Filebody. Ich füge immer zuerst den Dateikörper hinzu, der mir das Problem verursacht hat. Ich habe die Reihenfolge von addpart der Pantomime um sehr Anfang und umgekehrt alle Informationen einschließlich Pantomime korrekt am php Server Ende erhalten.

1

Anstatt die JARS-Dateien einzuschließen, können Sie die in Android definierten HTTP-Multipart-Klassen verwenden, die jedoch als intern deklariert sind. Sie können sie nicht direkt verwenden, sondern müssen sie von android source code herunterladen und zu Ihrem Projekt hinzufügen. Einige grundlegende Änderungen müssen durchgeführt werden, bevor Sie sie verwenden, nichts schwierig (ändern Sie den Namen des Pakets, entfernen Sie alle Logger Anrufe). Es funktioniert perfekt für mich. Ich hoffe, dass dies jemandem helfen könnte,

+0

Link ist kaputt. – Zammbi

1

Also während alle oben genannten Antworten geholfen haben, es richtig zu machen.

Aber nur das Entfernen der HttpMultipartMode.BROWSER_COMPATIBLE würde es nicht lösen.

Sie können den MIME-Typ festgelegt, indem Sie dieses

tun
ByteArrayBody bab = new ByteArrayBody(params.getByteArray("data"), "image/jpeg" , "image.jpg"); 

N. B. Ich bin mit dem neuesten Android-Client neu gepackte http://code.google.com/p/httpclientandroidlib/ die mehrteiliger Uploads unterstützt usw.

+0

Großartig .... thanks.its wirklich meine Zeit sparen. –

2

Ich hatte gerade das gleiche Problem, wenn Httpclient von Version 4.1 auf Version 4.4 zu aktualisieren. Weder das Entfernen von HttpMultipartMode.BROWSER_COMPATIBLE noch das Ersetzen durch andere alternative Optionen hat geholfen.

Eine Lösung, die die minimale Veränderung für mich erfordert, ist explizit die filename angeben, wenn ein FileBody Konstruktion, dh

ersetzt
new FileBody(file, mimeType) 

mit

new FileBody(file, filename, mimeType, charset) 

Wie bei Version Httpclient 4.4, der Grund könnte sei das new FileBody(file, mimeType) ordnet null dem filename Feld statt file.getName(). Bei der Ausführung von formatMultipartHeader in HttpMultipart wird filename des Teils, der formatiert werden soll, im BROWSER_COMPATIBLE-Modus auf Null überprüft. Wenn null, wird der gesamte Körper ignoriert.

Verwandte Themen