#amazon-web-services #amazon-s3
Вопрос:
Я пытаюсь загружать объекты в S3, используя URL-адреса, подписанные пользователем
Вот мой код на python: (см. этот пост: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html)
import json
URL = "https://exmaple.server-give-me-presigned-URLs"
r = requests.get(url = URL)
response = r.json()
print("debug type payload: ", type(response))
print("debug key: ", response.keys())
print("debug value: ", response["jsonresult"])
print("debug ", response["signedupload"]["fields"])
print("debug ", response["signedupload"]["url"])
print("url type ", type(response["signedupload"]["url"]))
with open("test-wav-file.wav", 'rb') as f:
files = {'file': ("/test-wav-file.wav", f)}
http_response = requests.post(response["signedupload"]["url"], data=response["signedupload"]["fields"], files=files)
print("File upload HTTP: ", http_response.text)
Я получил ошибку при запуске:
('File upload HTTP: ', u'<?xml version="1.0" encoding="UTF-8"?>n<Error><Code>AccessDenied</Code><Message>Invalid according to Policy: Policy Condition failed: ["eq", "$content-type", "audio/wav"]</Message><RequestId>1TRNC1XPX4MCJPN6</RequestId><HostId>h/YdSUDuPeZhUU1TqAu1BZrCfyXKiNTYvisbvp3iaLcoLoriQPREnJI1LZp69hDE4kOWYSVog7A=</HostId></Error>')
Но когда я изменяю тип содержимого заголовка на headers = {'Content-type': 'audio/wav'}
Я получил ошибку:
('File upload HTTP: ', u'<?xml version="1.0" encoding="UTF-8"?>n<Error><Code>PreconditionFailed</Code><Message>At least one of the pre-conditions you specified did not hold</Message><Condition>Bucket POST must be of the enclosure-type multipart/form-data</Condition><RequestId>S86QYFG0AYTY26WQ</RequestId><HostId>lvxNkydNcuiwE/UVZY2xRMBoqk/BSUn7qathgXWSu3Fii8ZlVlKDkEjOotw4fmU3bfFgjYbsspE=</HostId></Error>')
Итак, есть ли у нас какой-либо тип контента, удовлетворяющий всем условиям? Пожалуйста, помогите мне
Большое спасибо
Комментарии:
1. Какие условия вы поставили в URL-адресе? Вы не показали свой код, как именно вы создали свой предварительно подписанный URL-адрес.
2. Я не тот человек, который генерирует предварительно подписанный URL-адрес, я просто звоню на сервер, и они предоставляют мне всю необходимую информацию для загрузки на свой S3.
3. Поэтому вы должны спросить, кто когда-либо создавал эти URL-адреса, какие условия вы должны выполнить.
4. Полезная нагрузка должна быть
"signedupload": { "url": "https://s3.ap-southeast-1.amazonaws.com/xxxxx", "fields": { "acl": "private", "key": "asd/rs9_xxxx.wav", "x-amz-algorithm": "xx", "x-amz-credential": "xxxx_request", "x-amz-date": "20010355Z", "x-amz-security-token": "xS2R", "policy": "exxxx9XX0=", "x-amz-signature": "xxxfb00a922" } }
5. хорошо, большое спасибо @Marcin, я постараюсь им сказать
Ответ №1:
Я решаю свою проблему:
просто добавьте 2 поля "content-type": "audio/wav"
и "x-amz-meta-tag": ""
в полезную нагрузку, и это сработает 😀
x-amz-meta-tag
может иметь любое значение.
Надеюсь помочь кому-то вроде меня