0

承認を得て、Amazon S3 バケットにファイルをアップロードしようとしています。私の署名が機能することはわかっています。hurl.itと同じ URL、ヘッダー、および署名を使用すると、アップロードが成功します。

また、私のプログラムで通常のファイル アップロードが機能することもわかっています。S3 セキュリティをオフにしてヘッダーを削除すると、アップロードは正常に機能します。

HttpClient client = new DefaultHttpClient();
url = "http://mybucket.s3.amazonaws.com/test/" + filename;

HttpPut put = new HttpPut(url);
put.setEntity(entity);
put.addHeader("Date", formattedDate);
put.addHeader("Authorization",
              "AWS " + c.getString(R.string.AWSAccessKeyId) +
              ":" + signature);
put.addHeader("Content-Type",contentType);


HttpResponse httpResponse = client.execute(put);
Log.e(TAG, allHeaders(httpResponse));

HttpEntity responseEntity = httpResponse.getEntity();
InputStream content = responseEntity.getContent();
InputStreamReader is = new InputStreamReader(content);
BufferedReader br = new BufferedReader(is,2000);

String read = br.readLine();
Log.e("AUTH", ">>>"+read+"<<<");
String response = "";
while (read != null){
    Log.e("AUTH", read);
    read = br.readLine();
    response += read + "\n";
}

Log.e("Code:", ""+httpResponse.getStatusLine().getStatusCode());

また、これを Android エミュレーターで非同期に行っていることも注目に値します。

結果のヘッダー ( を使用して表示Log.e(TAG, allHeaders(httpResponse))) は次のとおりです。

Date: Thu, 31 May 2012 05:58:08 GMT
Connection: close
Server: AmazonS3
Transfer-Encoding: chunked

応答ステータス コードは400: Bad Requestです。

奇妙なのは、これらのヘッダーを取得しても、コンテンツ ストリームresponseEntity.getContent()が完全に空であることです。while ループには入りません。

また、対象を絞ったものに切り替えてみましたが、これは完全にうまくHttpGetいきました。www.google.com

チャンクエンコーディングに何か問題がありますか? 明らかな間違いはありますか?

4

1 に答える 1

0

なぜこれが機能したのかはわかりませんが、どういうわけか私の署名エンコーディングは、http モデル全体を完全に台無しにする隠し文字を追加していました。最後の文字を除いた署名の部分文字列を使用しただけで、チャンク ストリームを読み取ることができました。

于 2012-06-08T00:43:44.750 に答える