我们计算的请求签名与您提供的签名不匹配。检查您的密钥并签名

2024-09-27 23:14:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用python脚本中预先指定的URL进行多部分上传。这些URL由我的java后端生成

1-IinitiateMultipartUploadRequest(String bucketName, String objectKey)和getuploadId。 2-在我的python脚本中,我计算了部分的数量(例如,对于5GB文件,我有10部分500MB) 3-从脚本中,我调用后端以生成所有预签名的urlList<String> generateUrls(int nbParts, String bucketName, String objectKey, String uploadId)

我得到了这些网址:

['https://XXXXXXX/bmaap_test/multipart-test/chectl-linux-x64.tar.gz?AWSAccessKeyId=O2WPRORAGHXKBLCB6BY6&Expires=1611254907&PartNumber=1&UploadId=00000177260F96DB006E1CBCF94D112F&Signature=y5%2FhsWgL1RHv8VAnoKFDf3kgq%2Bg%3D', 'https://XXXXXXX/bmaap_test/multipart-test/chectl-linux-x64.tar.gz?AWSAccessKeyId=O2WPRORAGHXKBLCB6BY6&Expires=1611254907&PartNumber=2&UploadId=00000177260F96DB006E1CBCF94D112F&Signature=vt0hpadC3KKHWUWAw9Cr2pdUWKA%3D']

脚本生成了一些url,但是当我试图从python中使用这些url时

#Generate presigned urls 
url = "http://localhost:8080/s3/generateListPresignedUrls"
params={'bucketName': 'bmap-catalogue-data', 'objectKey': 'bmaap_test/multipart-test/chectl-linux-x64.tar.gz', 'nbParts': nbParts, 'uploadId': uploadId}
response = requests.get(url, params = params)

stringList = response.text
str1 = stringList.replace(']','').replace('[','')
listPresignedUrl  = str1.replace('"','').split(",")

    # we load the data
    print(listPresignedUrl)
    parts = []
   
    #sys.stdout = open("log.txt", "w")
    with open(filePath, 'rb') as f:    
        i = 0
        while i < nbParts:
            print("Upload part "+ str(i))
            file_data = f.read(max_size)
            params={'uploadId': uploadId, 'partNumber': int(i+1)}
            response = requests.put(url, data=file_data)
            print(response.headers)
            print(response.text)
            etag = response.headers['ETag']  
            parts.append({'eTag': etag, 'partNumber': int(i+1)})
            print(parts)
            i = i+1

我得到了这个例外

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><RequestId>0073000001771B5A70864A6D0499635C</RequestId><HostId>RK9lG2UqStX9VB1+V+0veBulp7geOgTYtiaI9cliex8QYDq0hR8OLS2wrI7drf2O</HostId>
<AWSAccessKeyId>O2WPRORAGHXKBLCB6BY6</AWSAccessKeyId>
<SignatureProvided>PzvaVA6tLdWgz3dIWACNdjT4sUA=</SignatureProvided><StringToSign>PUT

当我在生成URL时删除uploadId和partnumber时,我可以上传数据,但多部分请求不起作用。所以我需要请求中的uploadId和partNumber

请问,为什么带有额外参数的预签名url不起作用? 提前谢谢

我在我的用例中使用这些tuto: https://github.com/sandyghai/AWS-S3-Multipart-Upload-Using-Presigned-Urlhttps://medium.com/altostra/multipart-uploads-with-s3-pre-signed-urls-d98712cc4da2


Tags: httpstest脚本urldatastringresponseparams

热门问题