我正在为Android编写自己的Google Drive客户端实现,而我正在使用docs list api。最近我遇到了以下问题:
起初我使用HttpURLConnection上传文件,但似乎在调用getResponseCose()之后将数据写入套接字,而不是在我写入连接的OutputStream时,这对我来说是必须的。
然后我切换到Apache HttpClient,但我仍然得到400响应,不知道为什么。也许你能够帮助我。以下是用于上传文件的代码。
String putUrl = conn.getHeaderField("Location");//from the previous request
final HttpClient client = new DefaultHttpClient();
final HttpPut put = new HttpPut(putUrl);
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
put.addHeader("Content-Type", mime==null?"file":mime);
//put.addHeader("Content-Length", String.valueOf(length));
put.addHeader("Content-Range", "bytes 0-"+(length-1)+"/"+length);
put.addHeader("GData-Version", "3.0");
put.addHeader("Authorization", getAuthorizationProperty());
entity.addPart("content", new InputStreamBody(in, name));
put.setEntity(entity);
HttpResponse resp = client.execute(put);
int response = resp.getStatusLine().getStatusCode();
if(response == HttpStatus.SC_CREATED){
lastCreated = parseSingleXMLEntry(resp.getEntity().getContent());
}
HttpURLConnection的标题完全相同。也许实体是错的?
答案 0 :(得分:0)
好的,解决方案很简单,希望它对某人有用。
我必须删除为请求添加标头的所有行。之后我将mime类型添加到InputStreamBody构造函数并覆盖getContentLength()方法以提供流长度。最后它看起来像这样:
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
entity.addPart("content", new InputStreamBody(in, ,mime, name){
@Override
public long getContentLength() {
return length;
}
});
put.setEntity(entity);
HttpResponse resp = client.execute(put);
就是这样。