使用AWS presigned URL to PUT 的应用是什么?
What's the application for using AWS presigned URL to PUT?
据我所知,预签名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?我觉得这说不通。有人可以教我吗?
你不提供尸体。您提供存储桶和密钥,SDK 为您提供预签名 URL,然后您与您的客户共享该 URL。然后您的客户将文件上传到 URL。您指定存储桶和对象键,而客户端提供文件内容。
以下是如何为上传生成预签名 URL 的示例:
import boto3
s3 = boto3.client('s3')
print s3.generate_presigned_url('put_object', { 'Bucket': 'xxx', 'Key': 'yyy' }, 3600)
这是一个如何上传到预签名 URL 的示例:
import requests
payload = 'fred'
url = <whatever previous script returned>
r = requests.put(url, data=payload)
r.raise_for_status()
据我所知,预签名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?我觉得这说不通。有人可以教我吗?
你不提供尸体。您提供存储桶和密钥,SDK 为您提供预签名 URL,然后您与您的客户共享该 URL。然后您的客户将文件上传到 URL。您指定存储桶和对象键,而客户端提供文件内容。
以下是如何为上传生成预签名 URL 的示例:
import boto3
s3 = boto3.client('s3')
print s3.generate_presigned_url('put_object', { 'Bucket': 'xxx', 'Key': 'yyy' }, 3600)
这是一个如何上传到预签名 URL 的示例:
import requests
payload = 'fred'
url = <whatever previous script returned>
r = requests.put(url, data=payload)
r.raise_for_status()