Насколько я знаю, предопределенный URL-адрес - это способ предоставления разрешения посторонним лицам работать через определенный URL-адрес, но этот URL-адрес кажется очень строгим с точки зрения формирования. Любая разница при проверке подписи может привести к 403
Для загрузки это просто, а как насчет загрузки?
Допустим, я хочу создать URL, который загружает test.txt
в testbucket
, я мог бы использовать
s3.generate_presigned_url(ClientMethod='put_object', Params={'Bucket': 'testbucket', 'Key': 'test.txt'}, HttpMethod='PUT', ExpiresIn=120)
но это приводит к пустому файлу в моем буфере при вызове URL (requests.put(url)
)
Я должен указать содержимое как
with open(some_file, 'rb') as f:
s3.generate_presigned_url(ClientMethod='put_object', Params={'Bucket': 'testbucket', 'Key': 'test.txt', 'Body': f.read()}, HttpMethod='PUT', ExpiresIn=120)
Для того, чтобы действительно получить значимую загрузку.
Но это побеждает цель? Этот URL-адрес должен быть отправлен другим пользователям для использования. Если я уже знаю все о файле, включая его содержимое, не означает ли это, что у меня уже есть файл? Что делать, если это неизвестный файл, который я могу получить только некоторую информацию, такую как file_name
и, возможно, content-length
и content-type
?
И даже если, скажем, я создаю конечную точку API и прошу пользователя передать данные (включая их содержимое, я полагаю), а затем я сгенерирую URL для пользователя, я мог бы также получить данные и загрузка напрямую, а не через предварительно подписанный URL, верно?
И это одна транзакция. Кажется, что это будет намного сложнее, когда я хочу сделать загрузку из нескольких частей. Нужно ли создавать несколько предварительно подписанных URL для такого пользователя? Я не могу найти в этом смысл. Может ли кто-нибудь научить меня?