我正在尝试通过documented here方法通过新的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();
}
我不知道我做错了什么。
答案 0 :(得分: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
。