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
κ·Έλ¬λ μμ²μ λν΄ λμΌν μμ μ μλνλ©΄ λ€μ μ€λ₯μ ν¨κ» 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>
λ΄κ° μλν κ²μ λ€μκ³Ό κ°μ΅λλ€.
url = https://mybucket-dev.s3.amazonaws.com/6b89e187-26fa-11e5-a04f-a45e60d45b53?Signature=Ow%3D&Expires=1436595966&AWSAccessKeyId=AQ
headers = {'Content-Length': '52369', 'Host': 'mybucket-dev.s3.amazonaws.com', 'Expect': '100-continue', 'Accept': '*/*', 'User-Agent': 'curl/7.37.1'}
payload={'Expires': '1436595966', 'AWSAccessKeyId': 'AQ', 'Signature': 'Ow%3D'}
requests.put(url, files={'file': base64_encoded_image})
requests.put(url, files={'upload_file': base64_encoded_image})
requests.put(url, files={'file': base64_encoded_image}, headers=headers)
requests.put(url, files={'file': base64_encoded_image}, headers=headers, data=payload)
λͺ¨λ λμΌν μ€λ₯λ‘ μ€ν¨ν©λλ€. μμΈν μ 보 νμ λͺ¨λμ 컬μ λ€μκ³Ό κ°μ΅λλ€.
* 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
μ, 1λ¨κ³λ Expect: 100 Continue
보λ΄λ κ²μ νΌνλ κ²μ
λλ€. μ°λ¦¬λ κ·Έλ€μ μ λλ‘ μ²λ¦¬νμ§ μμ΅λλ€. λν μμ μ Content-Length
ν€λλ₯Ό 보λ΄μ§ λ§μμμ€. μμ²μ λ°λΌ μ²λ¦¬λ©λλ€.
μ§μ§ λ¬Έμ λ μ
λ‘λκ° λ©ν°ννΈ/νΌ μΈμ½λ©μ΄ λ κ²μ΄λΌκ³ μκ°νμ§λ§ curlμ΄ νμΌμ μ§μ μ
λ‘λνλ€λ κ²μ
λλ€. μλ: requests.put(url, data=open('img.png', 'rb'))
κ·Έλμ λλ€μΌλ‘ μ΄λ―Έμ§λ₯Ό λ§λ€μ΄μ
curl --request PUT --upload-file img.png https://httpbin.org/put
curlμ΄ λ΄κ° μμν κ²κ³Ό μ νν μΌμΉνλμ§ νμΈνκΈ° μν΄. νμΌμ μμ λ°μ΄ν°λ‘ μ λ‘λν©λλ€.
μμ²μ files=
맀κ°λ³μλ μμ λ°μ΄ν° μ
λ‘λκ° μλλΌ multipart/form-data
μ
λ‘λλ₯Ό μνν©λλ€. μμ²μμ λμΌν λμμ 볡μ νλ €λ©΄ λ€μ μμ
λ§ νλ©΄ λ©λλ€.
with open('img.png', 'rb') as data:
requests.put(url, data=data)
μμ²μ μ½ν μΈ κΈΈμ΄ λ° κΈ°ν λͺ¨λ μ€μ μ μ²λ¦¬ν©λλ€.
곡μ₯! μ λ§ κ°μ¬ν©λλ€ μ¬λ¬λΆ :dancer: :smile:
zip νμΌμ μ¬μ©νμ¬ λ€μκ³Ό κ°μ λ¨μλ₯Ό μ»μ΅λλ€. (requests-2.13.0)
with open('default.zip', 'rb') as data:
requests.put(url, data=data)
μ°μΆ:
C:\svn\libraries\cpp>python req_put.py default.zip
MD5: 5dc0658d93e942fa7d1fa443e04bba83
SHA1: 18e7980d9d9ac544ac3e684a4d051932c3a3a336
Traceback (most recent call last):
File "req_put.py", line 102, in <module>
resp = requests.put(uri, headers=headers, data=data) # data=data , params=payload)
File "C:\Python27\lib\site-packages\requests\api.py", line 124, in put
return request('put', url, data=data, **kwargs)
File "C:\Python27\lib\site-packages\requests\api.py", line 56, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "C:\Python27\lib\site-packages\requests\adapters.py", line 473, in send
raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', error(10054, 'An existing connection was forcibly closed by the remote host'))
κ°μ₯ μ μ©ν λκΈ
κ·Έλμ λλ€μΌλ‘ μ΄λ―Έμ§λ₯Ό λ§λ€μ΄μ
curlμ΄ λ΄κ° μμν κ²κ³Ό μ νν μΌμΉνλμ§ νμΈνκΈ° μν΄. νμΌμ μμ λ°μ΄ν°λ‘ μ λ‘λν©λλ€.
μμ²μ
files=
맀κ°λ³μλ μμ λ°μ΄ν° μ λ‘λκ° μλλΌmultipart/form-data
μ λ‘λλ₯Ό μνν©λλ€. μμ²μμ λμΌν λμμ 볡μ νλ €λ©΄ λ€μ μμ λ§ νλ©΄ λ©λλ€.μμ²μ μ½ν μΈ κΈΈμ΄ λ° κΈ°ν λͺ¨λ μ€μ μ μ²λ¦¬ν©λλ€.