30

この方法でファイルをダウンロードする方法を知っています:key.generate_url(3600)

しかし、アップロードしようとするkey.generate_url(3600, method='PUT')と、URL が機能しませんでした。私が言われた: The request signature we calculated does not match the signature you provided. Check your key and signing method.

boto関数の使用方法に関するサンプル コードがホームページに見つかりませんgenerate_url(method='PUT')。アップロードに使用する方法を知っている人はいますか?アップロードファイルのパスにパラメータを設定するには?

4

5 に答える 5

48

私はこれを実験する時間を見つけました。ここに私が見つけたものがあります。

>>> import boto
>>> c =boto.connect_s3()
>>> fp = open('myfiletoupload.txt')
>>> content_length = len(fp.read())
>>> c.generate_url(300, 'PUT', 'test-1332789015', 'foobar', headers={'Content-Length': str(content_length)}, force_http=True)
'http://test-1332789015.s3.amazonaws.com/foobar?Signature=oUARG45mR95utXsiQYRJNiCI4x4%3D&Expires=1333731456&AWSAccessKeyId=AKIAJOTCCJRP4C3NSMYA&Content-Length=16'

次に、curl を使用して、次のようにファイルをその URL に PUT することができました。

$ curl --request PUT --upload-file myfiletoupload.txt "http://test-1332789015.s3.amazonaws.com/foobar?Signature=oUARG45mR95utXsiQYRJNiCI4x4%3D&Expires=1333731456&AWSAccessKeyId=AKIAJOTCCJRP4C3NSMYA&Content-Length=16"

これにより、ファイルがバケットにアップロードされました。というわけで、どうやら可能のようです。content-md5 値を計算してヘッダーに含めることができるかどうかを確認したい場合がありますが、そのヘッダーを送信するために curl を取得する方法も理解する必要があります。また、HTTP ではなく HTTPS でこれを機能させることができるはずですが、試したことはありません。

于 2012-04-06T17:00:34.757 に答える
9

これは、2012 年 4 月 6 日の garnaat の回答に対するフォローアップです。

資格情報がある署名付き URL サーバー側を生成し、クライアントがコンテンツを直接アップロードできるようにそれをクライアントに渡します。任意のサイズのファイルをアップロードできるほどクライアントを信頼していますが、セキュリティ トークンを与えるほどではありません。クライアントがリクエストの一部としてコンテンツの大きさをサーバーに伝えないようにしたかったのです。したがって、私のフォローアップの答え。

ヘッダーでコンテンツの長さを指定したり、force_http=True を指定したりしなくても、PUT メソッドの署名付き URL を取得できました。

Boto 2.31.1 の使用: garnaat の回答のように:

>>> import boto
>>> c =boto.connect_s3()

次に、代わりに使用しました:

>>> temp_url = c.generate_url(seconds_available, 'PUT', bucket_name, s3_key)

これにより、次の形式の URL が生成されました。

https://s3_location/bucket_name/s3_key?Signature=Ew407JMktSIcFln%2FZe00VroCmTU%3D&Expires=1405647669&AWSAccessKeyId=kM__pEQo2AEVd_Juz4Qq

その後、curl を使用してファイルを投稿できました。

>>> os.system('curl --request PUT --upload-file true_measure/test_files/test_file_w_content.txt "'+temp_url+'"')

私は通常、 Python リクエストを使用してテストとデバッグを作成するため、これを理解するのに非常に苦労しました。ただし、リクエストを使用してこれらのboto生成の署名付きURLの1つにファイルを配置するために使用しようとすると、認証に失敗します。これを完全にデバッグしたわけではありませんが、curl が生成するものと比較して、リクエストがいくつかのヘッダーを追加しているためだと思われます。

このフォローアップの回答が、私が経験したデバッグの苦痛を他の誰かに惜しまないことを願っています。

于 2014-07-18T17:23:47.367 に答える
1

boto (boto3 ではない) を使用している場合、アップロードを機能させる唯一の方法は を使用することでしたgenerate_url_sigv4。バニラを使用generate_urlすると、元の質問で報告されたのと同じエラーが発生しました。どの機能が機能するかを制御する、私が知らないAWSアカウント設定がある可能性があります。

boto 2.49.0 と requests 2.22.0 を使用する Python インタープリター:

import boto
import os
import requests
os.environ['S3_USE_SIGV4'] = 'True'
c = boto.connect_s3(host='s3.amazonaws.com')
url = c.generate_url_sigv4(3600, 'PUT', 'my-bucket-name', 'bucket-path/to/file.txt')
with open('file.txt') as f:
    resp = requests.put(url, data=f.read())

>>> resp
<Response [200]>

ホスト名で接続しないと、URL の生成時に次のエラーが表示されます。

boto.s3.connection.HostRequiredError: BotoClientError: When using SigV4, you must specify a 'host' parameter.

関連:
「HmacAuthV1Handler」オブジェクトに属性「presign」がないのはどういう意味ですか?

boto3 を使用している場合、署名付きの POST の方が文書化されているようです:
https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html#generating-a-presigned-ファイルをアップロードする URL

于 2020-03-19T14:59:05.810 に答える