如何使用Python请求在Amazon S3上执行“PUT”
发布时间:2020-12-20 11:44:12 所属栏目:Python 来源:网络整理
导读:我正在尝试使用 Python请求将文件上传到Amazon S3(Python是v2.7.9,请求是v2.7).遵循完美运行的curl命令: curl --request PUT --upload-file img.png https://mybucket-dev.s3.amazonaws.com/6b89e187-26fa-11e5-a04f-a45e60d45b53?Signature=Ow%3DExpires=1
我正在尝试使用
Python请求将文件上传到Amazon S3(Python是v2.7.9,请求是v2.7).遵循完美运行的curl命令:
curl --request PUT --upload-file img.png https://mybucket-dev.s3.amazonaws.com/6b89e187-26fa-11e5-a04f-a45e60d45b53?Signature=Ow%3D&Expires=1436595966&AWSAccessKeyId=AQ 但是当我对请求做同样的事情时,它就失败了.这是我尝试过的: url = https://mybucket-dev.s3.amazonaws.com/6b89e187-26fa-11e5-a04f-a45e60d45b53?Signature=Ow%3D&Expires=1436595966&AWSAccessKeyId=AQ requests.put(url,files={'file': base64_encoded_image}) requests.put(url,files={'upload_file': base64_encoded_image}) 它失败了403,我得到的回应是: <Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message> 然后我以详细模式运行curl: * Hostname was NOT found in DNS cache * Trying 54.231.168.134... * Connected to mybucket-dev.s3.amazonaws.com (54.231.168.134) port 443 (#0) * TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA * Server certificate: *.s3.amazonaws.com * Server certificate: VeriSign Class 3 Secure Server CA - G3 * Server certificate: VeriSign Class 3 Public Primary Certification Authority - G5 > PUT /6b89e187-26fa-11e5-a04f-a45e60d45b53?Signature=Ow%3D&Expires=1436595966&AWSAccessKeyId=AQ HTTP/1.1 > User-Agent: curl/7.37.1 > Host: mybucket-dev.s3.amazonaws.com > Accept: */* > Content-Length: 52369 > Expect: 100-continue > < HTTP/1.1 100 Continue * We are completely uploaded and fine < HTTP/1.1 200 OK < x-amz-id-2: 5lLCQ3FVrTBg2vkyk44E+MecQJb2OGiloO0+2pKePtxPgZptKECNlUyYN43sl4LBNe9f8idh/cc= < x-amz-request-id: 636A24D53DEB5215 < Date: Fri,10 Jul 2015 12:04:44 GMT < ETag: "5802130d4320b56a72afe720e2c323a7" < Content-Length: 0 * Server AmazonS3 is not blacklisted < Server: AmazonS3 < * Connection #0 to host mybucket-dev.s3.amazonaws.com left intact 所以我添加了标题 headers = {'Content-Length': '52369','Host': 'mybucket-dev.s3.amazonaws.com','Expect': '100-continue','Accept': '*/*','User-Agent': 'curl/7.37.1'} requests.put(url,files={'file': base64_encoded_image},headers=headers) 我尝试了不同的标题组合,仍然会抛出相同的错误.然后我也尝试发送查询参数: payload={'Expires': '1436595966','AWSAccessKeyId': 'AQ','Signature': 'Ow%3D'} requests.put(url,headers=headers,data=payload) 它仍然失败并且同样的错误.我尝试了没有查询参数的URL,并将它们作为data = payload发送到请求,它失败并出现相同的错误. 解决方法requests 工程师帮助我:
with open('img.png','rb') as data: requests.put(url,data=data) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |