3

ここに記載されている方法を使用して、新しい API を介して人気のあるサービス Dailybooth に写真をアップロードしようとしています。

問題は、サーバーが次のように応答していることです。

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

このデータを送信するために使用しているコードは次のとおりです。

// 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();
}

私は何が間違っているのか分かりません。

4

1 に答える 1

8

MultipartEntity のコンテンツを記述するクラスStringBodyとクラスのいずれかを使用しています。InputStreamBodyソースを見るとStringBody.getContentLength()、文字列の長さが返されますが、InputStreamBody常に-1. .

コンテンツの長さを設定できるようにしたい場合は、事前にストリームのサイズを知る必要があります。その場合にできることは、次のように設定するInputStreamBodyことです。

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

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

byte[]または、ストリームを配列にダンプしてByteArrayInputStreamに渡しInputStreamBodyます。もちろん、そうすると、データを送信する前にデータをメモリにキャッシュする必要があるため、ストリーミング機能が失われます...

画像を扱っているとおっしゃっていましたが、これはもしかして画像Fileですか?もしそうなら、あなたもそれを持っFileBodyています 正しい を返しますcontent-length

于 2011-01-16T17:19:17.507 に答える