0

私は Android 用の Google ドライブ クライアントの独自の実装を作成しており、ドキュメント リスト API を使用しています。最近、次の問題が発生しました。

最初は HttpURLConnection を使用してファイルをアップロードしていましたが、接続の OutputStream に書き込むときではなく、getResponseCose() を呼び出した後にソケットにデータを書き込むようです。これは私にとって必須です。

次に、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 で機能しました。多分エンティティは間違っていますか?

4

1 に答える 1

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);

それだけです。

于 2012-06-25T15:32:27.013 に答える