使用AWS presigned URL to PUT 的应用是什么?

What's the application for using AWS presigned URL to PUT?

据我所知,预签名url是一种允许外人通过给定的url进行操作的方式,但是这个url似乎在条款上确实很严格的形成。检查签名时的任何差异都可能导致 403

对于下载来说,很简单,但是对于上传呢?

假设我想生成一个 url 上传 test.txttestbucket,我可以使用

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-lengthcontent-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()