Frage

Ich versuche, ein Foto zu dem beliebten Dienst Dailybooth über ihre neue API durch die Methode zum Hochladen hier dokumentiert .

Das Problem ist, dass der Server mit antwortet:

<html><head><title>411 Length Required</title>...

Der Code, den ich mit diesen Daten zu senden ist hier:

// 2: Build request
HttpClient httpclient = new DefaultHttpClient();
SharedPreferences settings = DailyboothShared.getPrefs(DailyboothTakePhoto.this);
String oauth_token = settings.getString("oauth_token", "");
HttpPost httppost = new HttpPost(
        "https://api.dailybooth.com/v1/pictures.json?oauth_token=" + oauth_token);
Log.d("upload", "Facebook: " + facebook);
Log.d("upload", "Twitter: " + twitter);
try {
    InputStream f = getContentResolver().openInputStream(snap_url);
    MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    entity.addPart("picture", new InputStreamBody(f, snap_url.getLastPathSegment()));
    entity.addPart("blurb", new StringBody(blurb));
    entity.addPart("publish_to[facebook]", new StringBody(facebook));
    entity.addPart("publish_to[twiter]", new StringBody(twitter));
    httppost.setEntity(entity);
    HttpResponse response = httpclient.execute(httppost);
    Log.d("upload", response.toString());
    int statusCode = response.getStatusLine().getStatusCode();
    if (statusCode == 200) {
        // do something?
    } else {
        Log.d("upload", "Something went wrong :/");
    }
    Log.d("upload", EntityUtils.toString(response.getEntity()));
} catch (Exception ex) {
    ex.printStackTrace();
}

Ich habe keine Ahnung, was ich falsch mache.

War es hilfreich?

Lösung

Sie verwenden entweder StringBody und InputStreamBody Klassen, die den Inhalt Ihrer MultipartEntity beschreiben. Mit Blick auf die Quellen, StringBody.getContentLength() gibt die Länge der Zeichenfolge, aber InputStreamBody immer -1 zurückkehren, und ich denke, dies für den Fall gemacht wird, Sie müssen einige Daten an den Server laden, ohne die Größe der es zu wissen, und starten Sie das Hochladen, während die Daten kommen die der Strom.

Wenn Sie in der Lage sein, den Inhalt Länge einstellen, dann müssen Sie die Größe Ihres Strom zu vorher wissen, was Sie tun können, wenn das der Fall ist, ist die InputStreamBody auf diese Weise eingestellt werden:

new InputStreamBody(f, snap_url.getLastPathSegment()) {

    public long getContentLength() {
        return /*your length*/;
    }
}

oder Dump Stream in einem byte[] Array und übergeben ByteArrayInputStream zum InputStreamBody, natürlich tun, damit Sie die Streaming-Fähigkeit verlieren, wie Sie benötigen, um Ihre Daten im Arbeitsspeicher zwischengespeichert wird vor dem Senden über ...

Wie Sie sagten, Sie auf die Bilder arbeiten, sind diese Bilder File durch Zufall? Wenn ja auch FileBody haben, die die korrekte content-length zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top